题目链接
题目大意
有一个操作a是在一个数列里找随意一个数x把它变成-a-1,给你一个数组,你可以对这个数组进行任意次a操作,使得这个数组的乘积最大
解题思路
我们可以发现一个数是正数的时候,进行a操作会使得它的绝对值加一,负数进行一次操作使得绝对值减一,所以我们先把所有的整数都进行a操作,然后,如果n是一个偶数,直接输出,如果n是一个奇数,就把数组中最小的负数进行一次a操作就可以了
做这个题的时候感觉自己是个智障,一直在讨论负数个数的奇偶和整数个数的奇偶,然后就在各种奇偶性和大小中迷失。。。。。。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[100005];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]>=0)
a[i]=-a[i]-1;
}
if(n%2==0)
{
for(int i=1;i<=n;i++)
printf("%d%c",a[i],i==n?'\n':' ');
}
else
{
int minn=0;
for(int i=1;i<=n;i++)
minn=min(minn,a[i]);
int flag=0;
for(int i=1;i<=n;i++)
{
if(a[i]==minn&&!flag)
{
printf("%d%c",-a[i]-1,i==n?'\n':' ');
flag=1;
}
else
printf("%d%c",a[i],i==n?'\n':' ');
}
}
return 0;
}