CF374 Maxim and Array

贪心
如果有0先变成非0
如果负数的个数 应该变为偶数
之后就是每次将绝对值最小的值加K

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+5;
typedef long long ll;

int N,K,X;
ll A[MAXN];
int tag[MAXN];
struct Node{
    ll x; int id;
    Node(ll a=0, int b=0):x(a),id(b){}
    bool operator <(const Node &T) const {
        return x > T.x;
    }
};
ll Abs(ll x) {
    if(x < 0) x *= -1;
    return x;
}
void doo(int id,ll num) {
    if(A[id] > 0) A[id] += num;
    else A[id] -= num;
}
priority_queue<Node> Q;
int main(){
    while(~scanf("%d %d %d",&N,&K,&X)) {
        memset(tag,0,sizeof(tag));
        while(!Q.empty()) Q.pop();

    //  int c1 = 0; int c2 = 0; 
        int c3 = 0; // pos zero neg
        for(int i = 1; i <= N; ++i) {
            scanf("%lld",&A[i]);
            Q.push(Node(Abs(A[i]), i));
        }
        for(int i = 1; i <= N; ++i) {
            if(A[i] < 0) c3 ++; 
        }
        while(K) {
            ll x = Q.top().x; int id = Q.top().id;
            Q.pop();
            if(x == 0) {
                if(~c3&1) {
                    A[id] = -X;
                    c3 ++;
                }else {
                    A[id] = X; 
                }
            }else if(~c3&1){
                ll tt = (x+X)/X; 
                if(tt > K) {
                    doo(id, -1ll*K*X);
                    break;
                }else {
                    doo(id,-1ll*tt*X); K -= tt; K++;
                }
                c3 ++;
            }else {
                doo(id,X);
            }
//          printf("%d %lld\n",id,A[id]);
            Q.push(Node(Abs(A[id]),id)); K--;
        }

        for(int i = 1; i <= N; ++i) printf("%lld ",A[i]); printf("\n");
    }
    return 0;   
}
posted @ 2016-10-01 13:50  basasuya  阅读(127)  评论(0编辑  收藏  举报