D. Maxim and Array

 

https://www.cnblogs.com/qscqesze/p/5925893.html  原博客

http://codeforces.com/group/1EzrFFyOc0/contest/721/problem/D 题目

 

题意

给你n个数,你可以操作k次,每次使得一个数增加x或者减小x

你要使得最后所有数的乘积最小,问你最后这个序列长什么样子。

题解:

贪心,根据符号的不同,每次贪心的使得一个绝对值最小的数减去x或者加上x就好了

这个贪心比较显然。

假设当前乘积为ANS,那么你改变a[i]的大小的话,那么对答案的影响为ANS/A[i]/*X

然后找到影响最大的就好了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include <cctype>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<cmath>
 7 #include<string>
 8 #include<cmath>
 9 #include<set>
10 #include<vector>
11 #include<stack>
12 #include<queue>
13 #include<map>
14 using namespace std;
15 #define ll long long
16 #define mem(a,x) memset(a,x,sizeof(a))
17 #define se second
18 #define fi first
19 const int INF= 0x3f3f3f3f;
20 const int N=2e5+5;
21 
22 ll n,k,x;
23 ll a[N];
24 
25 set< pair<ll,ll> > s; //自动排序
26 
27 int main()
28 {
29     cin>>n>>k>>x;
30     bool flag=0; //负数的数目奇偶情况
31     for(ll i=1;i<=n;i++){
32         scanf("%lld",&a[i]);
33         if(a[i]<0)  flag^=1;//这技巧要记住
34         s.insert( make_pair (abs(a[i]),i) );//这技巧要记住
35     }
36     for(int i=1;i<=k;i++)
37     {
38         int j=s.begin()->second; //这技巧要记住
39         s.erase(s.begin());
40 
41         if(a[j]<0) flag^=1; //如果当前这个数是负数,负数数量减少1,讨论这个a[j]
42         if(!flag){ //除a[i]以外的 负数个数为偶数
43             a[j]-=x;
44         }
45         else{ //除a[i]以外的 负数个数为奇数
46             a[j]+=x;
47         }
48         if(a[j]<0) flag^=1; //再对改变后的a[j]讨论,如果是负的,负数数量+1;
49         s.insert( make_pair( abs(a[j]),j) );
50     }
51     for(int i=1;i<=n;i++)
52     {
53         cout<<a[i]<<' ';
54     }
55 }

 

posted @ 2018-07-20 10:54  木流牛马  阅读(310)  评论(0编辑  收藏  举报