贪心 如果有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; }转载于:https://www.cnblogs.com/Basasuya/p/8433742.html