Codeforces Round #569 (Div. 2) B. Nick and Array
Posted huangdf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #569 (Div. 2) B. Nick and Array相关的知识,希望对你有一定的参考价值。
原文链接:https://codeforces.com/contest/1180/problem/B
题意:给你n个数,你要进行一次或者多次操作(操作的方式a[i]=-a[i]-1),让它们的乘积最大,当然也可以不进行操作,答案有多组。
思路:根据(操作的方式a[i]=-a[i]-1),我们发现,正数进行操作后,绝对值变大了,那么想让全部数乘积最大,就让这组数全变成负数(是不是好奇,如果存在0的问题,0进行操作可以变为(-1)),然后判断个数n的奇偶,偶数就直接输出,奇数的话把最小(除去-1)的变为正数就行了.
代码:
1 #include"iostream" 2 #include"algorithm" 3 #include"cstring" 4 #include"cstdio" 5 #include"cmath" 6 using namespace std; 7 #define ll long long 8 int main(){ 9 std::ios::sync_with_stdio(false); 10 ll n; 11 while(cin>>n){ 12 ll a[n],b[n]; 13 for(int i=0;i<n;i++) { 14 cin>>a[i]; 15 if(a[i]==0) a[i]=-1; 16 if(a[i]>0) a[i]=a[i]*(-1)-1; 17 b[i]=a[i]; 18 } 19 sort(b,b+n); 20 if(n%2==0){ 21 for(int i=0;i<n;i++) cout<<a[i]<<" "; 22 cout<<endl; 23 } 24 else{ 25 int flag=0,tt=0; 26 for(int i=0;i<n;i++){ 27 if(b[i]!=1){ 28 tt=b[i]; 29 break; 30 } 31 } 32 for(int i=0;i<n;i++){ 33 if(a[i]==tt&&flag==0){ 34 a[i]=a[i]*(-1)-1; 35 cout<<a[i]<<" "; 36 flag++;} 37 else{ 38 cout<<a[i]<<" "; 39 } 40 } 41 } 42 cout<<endl; 43 } 44 return 0; 45 }
以上是关于Codeforces Round #569 (Div. 2) B. Nick and Array的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #436 E. Fire(背包dp+输出路径)
[ACM]Codeforces Round #534 (Div. 2)