题目见 :
http://codeforces.com/group/NVaJtLaLjS/contest/236618/problem/H
肯定要多翻转负数,少翻转正数,那么我们可以把数字分为正数负数分别排序,优先反转绝对值较大的负数,然后是0,最后是绝对值小的正数。
微不足道,但是我要真实还原我当时的做法:我记录正数,负数总和,然后如果需要反转正数了,我就从总和里面直接减去他的2倍,加上负数和的绝对值。同理,也可以从总和加上负数的绝对值*2。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int f[100003],a[100004];
int i,j,n,k,m=0,sum=0,sumz=0;
int r;
scanf("%d %d",&n,&k);
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if (a[i]<0)
{
m++;
f[m]=a[i];
}
else sumz+=a[i];
}
if (k<=m||(k-m)%2==0)
{
sort(f+1,f+m+1);
for (i=1;i<=m;i++)
if (i<=k) sum-=f[i];else sum+=f[i];
printf("%d\n",sumz+sum);
}
else
{
sumz=0;
for (i=1;i<=n;i++)
{
if (a[i]<0) a[i]=-a[i];
sumz+=a[i];
}
sort(a+1,a+n+1);
printf("%d\n",sumz-2*a[1]);
}
return 0;
}