生活随笔
收集整理的這篇文章主要介紹了
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 c3 =
0;
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);}
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
總結
以上是生活随笔為你收集整理的CF374 Maxim and Array的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。