原文链接:别点我我怕疼
题意:给你n个数,你要进行一次或者多次操作(操作的方式a[i]=-a[i]-1),让它们的乘积最大,当然也可以不进行操作,答案有多组。
思路:根据(操作的方式a[i]=-a[i]-1),我们发现,正数进行操作后,绝对值变大了,那么想让全部数乘积最大,就让这组数全变成负数(是不是好奇,如果存在0的问题,0进行操作可以变为(-1)),然后判断个数n的奇偶,偶数就直接输出,奇数的话把最小(除去-1)的变为正数就行了.
代码
#include"iostream"
#include"algorithm"
#include"cstring"
#include"cstdio"
#include"cmath"
using namespace std;
#define ll long long
int main(){
std::ios::sync_with_stdio(false);
ll n;
while(cin>>n){
ll a[n],b[n];
for(int i=0;i<n;i++) {
cin>>a[i];
if(a[i]==0) a[i]=-1;
if(a[i]>0) a[i]=a[i]*(-1)-1;
b[i]=a[i];
}
sort(b,b+n);
if(n%2==0){
for(int i=0;i<n;i++) cout<<a[i]<<" ";
cout<<endl;
}
else{
int flag=0,tt=0;
for(int i=0;i<n;i++){
if(b[i]!=1){
tt=b[i];
break;
}
}
for(int i=0;i<n;i++){
if(a[i]==tt&&flag==0){
a[i]=a[i]*(-1)-1;
cout<<a[i]<<" ";
flag++;}
else{
cout<<a[i]<<" ";
}
}
}
cout<<endl;
}
return 0;
}