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 }
posted @ 2020-01-21 17:01  柒月是你的謊言  阅读(102)  评论(0编辑  收藏  举报