SDUT 2022 Summer Individual Contest - 11(for 21) - Virtual Judge (csgrandeur.cn)
题意:给定一个序列,和需要取反的次数k,要求取反k次后的序列和最大。
思路:若都是正数则序列和最大。故先求出原序列负数的个数s,与k相比。
若k大于s,则说明可以将所有的负数转变为正数,剩下的次数根据奇偶来判断是否使abs()最小的数变负。
若k小于s,则从小到大使负数变为正数。
#include <bits/stdc++.h>
#define IOS \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define ll long long
const int N = 1e4 + 10;
#define INF 0x3f3f3f3f
using namespace std;
int a[N];
int main()
{
IOS;
int t;
cin >> t;
while (t--)
{
int n, m;
cin >> n >> m;
int minn = INF;
int flag = 0;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
if (a[i] < 0)
flag++;
}
sort(a + 1, a + n + 1);
int x=-1;
for(int i=1;i<=n;i++)
{
if(abs(a[i])<minn)
{
minn=abs(a[i]);
x=i;
}
}
int sum=0;
if(flag<m)
{
for(int i=1;i<=n;i++)
{
if(a[i]<0)
{
sum-=a[i];
}
else
sum+=a[i];
}
if((m-flag)%2)
sum-=(2*minn);
}
else
{
for(int i=1;i<=n;i++)
{
if(m)
{
sum-=a[i];
m--;
}
else
sum+=a[i];
}
}
cout << sum << endl;
}
return 0;
}