B. Nick and Array
题目大意:
给你n个数 a[1],[2],,,,,a[i] 每个数支持进行一次a[i]=-a[i]-1 问如何使乘积最大 输出操作后的n个数;
1≤n≤105 −106≤ai≤106
分析只要a[i]>=0 那么进行一次操作后总成积必定变大 ,而正负号只需要最后改变其中最大的值 (而且注意到逆向 操作一样)
ac代码:
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int main(){
int n;
scanf("%d",&n);
int a[100006];
int index1=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]>=0) a[i]=-a[i]-1;
if(abs(a[index1])<abs(a[i])) index1=i;
}
if(n%2==1) a[index1]=-a[index1]-1;
printf("%d",a[0]);
for(int i=1;i<n;i++)
printf(" %d",a[i]);
printf("\n");
}
迅雷公司福利 193人发布