题意:给定一个数组,你可以把数组的一个数ai=-ai-1,每个数只能进行一次这样的变换,问怎样变换后数组的乘积a1a2a3*…an最大,输出变换后的数组
思路:因为一个负数经过这样的变换后它的绝对值会变小,正数经变换后绝对值会增大,那么根据贪心思想就要把所有正数变成负数,看看最后乘起来的是正数的话就是最佳答案,但如果不是的话那么就有一个负数是要变成正数的,把谁变成负数代价最大呢?选绝对值最大的就行(这个可以自己证明)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,a[maxn],minn=1e9,cnt;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
if(a[i]>=0) a[i]=-a[i]-1;
if(a[i]<0) cnt++;
minn=min(minn,a[i]);
}
if(cnt%2==0){
for(int i=1;i<=n;++i) printf("%d ",a[i]);
return 0;
}
int flag=1;
for(int i=1;i<=n;++i)
if(minn==a[i]&&flag) printf("%d ",-a[i]-1),flag=0;
else printf("%d ",a[i]);
}