描述:
Recently Maxim has found an array of n integers, needed by no one. He immediately come up with idea of changing it: he invented positive integer x and decided to add or subtract it from arbitrary array elements. Formally, by applying single operation Maxim chooses integer i (1 ≤ i ≤ n) and replaces the i-th element of array ai either with ai + x or with ai - x. Please note that the operation may be applied more than once to the same position.
Maxim is a curious minimalis, thus he wants to know what is the minimum value that the product of all array elements (i.e. ) can reach, if Maxim would apply no more than k operations to it. Please help him in that.
The first line of the input contains three integers n, k and x (1 ≤ n, k ≤ 200 000, 1 ≤ x ≤ 109) — the number of elements in the array, the maximum number of operations and the number invented by Maxim, respectively.
The second line contains n integers a1, a2, ..., an () — the elements of the array found by Maxim.
Print n integers b1, b2, ..., bn in the only line — the array elements after applying no more than k operations to the array. In particular, should stay true for every 1 ≤ i ≤ n, but the product of all array elements should be minimum possible.
If there are multiple answers, print any of them.
5 3 1 5 4 3 5 2
5 4 3 5 -1
5 3 1 5 4 3 5 5
5 4 0 5 5
5 3 1 5 4 4 5 5
5 1 4 5 5
3 2 7 5 4 2
5 11 -5
题意:
给出n个数,k次机会,每次机会可以使得任意一个数字减少或者加上x,问使得最后的乘积最小的n个数,每个数是多少。
思路:
贪心思路是讨论这列数中负数的个数,如果为偶数,那么把数列中绝对值最小的数使其往0的方向前进。
如果为奇数,同样选择绝对值最小的数,使其往背离0的方向前进。
实现需要基本功,做题时需要思路清晰。
代码:
#include <bits/stdc++.h>
#define pr(x) cout << #x << "= " << x << " " ;
#define pl(x) cout << #x << "= " << x << endl;
#define ll __int64
using namespace std;
template<class T> void read(T&num) {
char CH; bool F=false;
for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
F && (num=-num);
}
const int N=2e5+10;
struct node{
ll num;
int id;
bool operator < (const node& tmp)const{
return abs(num)>abs(tmp.num);
}
};
priority_queue<node> q;
ll a[N];
int n,k;
ll x;
int main(){
/* #ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif*/
read(n);read(k);read(x);
int flag=1;
for(int i=1; i<=n; i++){
read(a[i]);
if(a[i]<0)flag=-flag;//偶数个负数为1,奇数个为-1
q.push((node){a[i],i});
}
while(k--){
node tmp=q.top();q.pop();
if(a[tmp.id]<0){
if(flag==-1)a[tmp.id]-=x;
else a[tmp.id]+=x;
if(a[tmp.id]>=0)flag=-flag;
}
else{
if(flag==-1)a[tmp.id]+=x;
else a[tmp.id]-=x;
if(a[tmp.id]<0)flag=-flag;
}
q.push((node){a[tmp.id],tmp.id});
}
for(int i=1; i<=n; i++){
printf("%I64d%c",a[i],i==n?'\n':' ');
}
return 0;
}