题意:给你一组数据,可以修改k次,每次对其中一个数进行+x或-x,然后把所有数相乘使得最后的乘积最小。
思路:一:使所有数的绝对值乘积最大;二:数据中存在奇数个负数。
首先找到初始数据中一共有几个负数num ,然后对于每一次修改,先找到绝对值最小的那个数,然后判断数据中是否有奇数个负数。如果是奇数,那个数的原值如果为负,则-x,否则+x;如果是偶数,那个数的原值如果为负,则+x,否则-x,最后更新一下num的值,以此类推。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int i;
long long v;
}a[200005];
long long b[200005];
struct cmp
{
bool operator()(node &x,node &y)
{
return x.v>y.v;
}
};
priority_queue<node,vector<node>,cmp>q;
int main()
{
int n,k,x,sum=0,num=0;
cin>>n>>k>>x;
long long v;
for(int i=1;i<=n;i++)
{
cin>>v;
if(v<0)
num++;
b[i]=v;
a[i].i=i;
a[i].v=abs(v);
q.push(a[i]);
}
node temp;
while(k)
{
temp=q.top();
q.pop();
if(num%2==0)
{
if(b[temp.i]>=0)
{
b[temp.i]-=x;
temp.v=abs(b[temp.i]);
if(b[temp.i]<0)num++;
}
else
{
b[temp.i]+=x;
temp.v=abs(b[temp.i]);
if(b[temp.i]>=0)num--;
}
}
else
{
if(b[temp.i]>=0)
{
b[temp.i]+=x;
temp.v=abs(b[temp.i]);
}
else
{
b[temp.i]-=x;
temp.v=abs(b[temp.i]);
}
}
q.push(temp);
k--;
}
for(int i=1;i<=n;i++)
{
printf("%lld ",b[i]);
}
return 0;
}