原文链接: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 }
来源:https://www.cnblogs.com/huangdf/p/12222397.html