CF #374 (Div. 2) D. 贪心,优先队列或set

1、CF #374 (Div. 2)   D. Maxim and Array

2、总结:按绝对值最小贪心下去即可

3、题意:对n个数进行+x或-x的k次操作,要使操作之后的n个数乘积最小。

(1)优先队列

#include<bits/stdc++.h>
#define F(i,a,b) for (int i=a;i<b;i++)
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=200100,MAX=1000100;

struct Num
{
    int i;
    LL val;     //一开始用int,一直挖9
    bool operator <(const Num &a1)const {
        return abs(val)>abs(a1.val);
    }
}a[N];

int main()
{
    int n,k,num1;
    LL x;
    while(~scanf("%d%d%lld",&n,&k,&x))
    {
        priority_queue<Num>Q;
        num1=0;
        F(i,0,n){
            scanf("%lld",&a[i].val);
            a[i].i=i;
            Q.push(a[i]);
            if(a[i].val<0)num1++;
        }
        Num ans;
        while(k--){
            ans=Q.top();Q.pop();
            if(num1%2) {
                if(ans.val==0){
                    ans.val+=x;
                }else if(ans.val>0){
                    ans.val+=x;
                }else {
                    ans.val-=x;
                }
            }else {
                if(ans.val==0){
                    ans.val-=x;
                    if(ans.val<0)num1++;
                }else if(ans.val>0){
                    ans.val-=x;
                    if(ans.val<0)num1++;
                }else {
                    ans.val+=x;
                    if(ans.val>=0)num1--;
                }

            }
            a[ans.i]=ans;
            Q.push(ans);
        }
        printf("%lld",a[0].val);
        F(i,1,n)printf(" %lld",a[i].val);
        puts("");

    }

    return 0;
}

(2)set

#include<bits/stdc++.h>
#define F(i,a,b) for (int i=a;i<b;i++)
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=200010,MAX=1000100;

int main()
{
    int n,k,flag;
    LL x,a[N];
    while(~scanf("%d%d%lld",&n,&k,&x))
    {
        flag=0;
        set<pair<LL,int> >S;
        F(i,0,n){
            scanf("%lld",&a[i]);
            if(a[i]<0)flag^=1;
            S.insert(make_pair(abs(a[i]),i));

        }
        while(k--){
            int pos=S.begin()->second;S.erase(S.begin());
            if(flag){
                if(a[pos]>=0)a[pos]+=x;
                else a[pos]-=x;
            }else {
                if(a[pos]>=0){
                    a[pos]-=x;
                    if(a[pos]<0)flag^=1;
                }
                else {
                    a[pos]+=x;
                    if(a[pos]>=0)flag^=1;
                }
            }
            S.insert(make_pair(abs(a[pos]),pos));
        }
        cout<<a[0];
        F(i,1,n)printf(" %lld",a[i]);
        cout<<endl;

    }

    return 0;
}

时间: 2024-10-29 19:05:40

CF #374 (Div. 2) D. 贪心,优先队列或set的相关文章

CF #374 (Div. 2) C. Journey dp

1.CF #374 (Div. 2)    C.  Journey 2.总结:好题,这一道题,WA,MLE,TLE,RE,各种姿势都来了一遍.. 3.题意:有向无环图,找出第1个点到第n个点的一条路径,经过的点数要最多. #include<bits/stdc++.h> #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,

C. Playlist Educational Codeforces Round 62 (Rated for Div. 2) 贪心+优先队列

C. Playlist time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You have a playlist consisting of nn songs. The ii-th song is characterized by two numbers titi and bibi — its length and beauty

poj3190Stall Reservations(贪心+优先队列)

题目链接: 啊哈哈,点我点我 思路: 首先根据挤奶时间的先后顺序排序...然后将第一头牛加入优先队列..然后就是加入优先队列的牛应该根据越早结束挤奶那么优先级更高,如果时间结束点相等,那么开始时间早的优先级高... 然后从前向后枚举.如果碰到有牛的挤奶时间的开始值大于优先队列的首部的结束值,那么说明这两头牛可以一起公用一个挤奶房..然后从优先队列中删除这头牛..那么这个问题就得到解决了... 题目: Language: Default Stall Reservations Time Limit:

CF #371 (Div. 2) C、map标记

1.CF #371 (Div. 2)   C. Sonya and Queries  map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的匹配. #include<bits/stdc++.h> #define max(a,b) a>b?a:b #define F(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,sizeof(a)) #define INF

CF#247(Div. 2)部分题解

引言: 在软件项目中,Maven提供了一体化的类库管理系统,非常实用.但是,如果新增的类库jar在网络上无法获取到,如何在本地按照Maven的规则添加进来呢?本文将通过一个小例子展示新增过程. 背景介绍: 一个Maven管理的Java项目,提供一个系统级别的POM.xml,其中定义了整个项目使用的类库. 需求: 需要添加一个自定义的类库到当前项目中.假定当前的类库文件名为:abc.jar.. 如何将类库添加进来? 1.  找到当前Maven的Repository类库位置 一般默认情况下,在win

CF #375 (Div. 2) D. bfs

1.CF #375 (Div. 2)  D. Lakes in Berland 2.总结:麻烦的bfs,但其实很水.. 3.题意:n*m的陆地与水泽,水泽在边界表示连通海洋.最后要剩k个湖,总要填掉多少个湖,然后输出. #include<bits/stdc++.h> #define F(i,a,b) for (int i=a;i<b;i++) #define FF(i,a,b) for (int i=a;i<=b;i++) #define mes(a,b) memset(a,b,s

poj 2431 Expedition (贪心+优先队列)

Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6890   Accepted: 2065 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to

BZOJ 2151 种树 贪心+优先队列+HASH

题意:链接 方法:贪心+优先队列 解析: 首先裸上贪最大的肯定不对. DP可行么?可行,两个数组一个记录选一个记录不选好像差不多n^2? 不过还是想想贪心. 贪最大的为什么不对? 因为有可能它旁边的两个加起来比它更优越? 所以能否找到一点关系呢? 既然话都说到这了,两个加起来可能更优越. 所以我们在选了最大的之后是否应该回推一个值呢?代表选旁边俩. 我们发现选旁边俩是两个单位,选一个是一个单位,如果我们推回去某个值后这个值相当于对应删去一个单位选两个单位,即增加一个单位,这显然不会影响最终我们选

POJ1456Supermarket(贪心+优先队列)

Supermarket Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9103   Accepted: 3891 Description A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an int