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)

codeforces569B

CodeForces - 569A.Music

Codeforces Round #726 (Div. 2) B. Bad Boy(贪心)

BestCoder Round #1