题解:B4468 符号选择 / opt

· · 题解

Solution

本题较为基础,读完题后不难发现,因为序列都是非负的,所以我们只需要让序列从大到小进行排序,让前 k 项使用正号,后面的数使用负号,这样就能使得到的总和最大。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
int x[100005];
int ans;
bool cmp(int a,int b)
{
    return a>b;
}
signed main()
{
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&x[i]);
    }
    sort(x+1,x+n+1,cmp);
//  for(int i=1;i<=n;i++)
//  {
//      printf("%lld",x[i]);
//  }
    for(int i=1;i<=n;i++)
    {
        if(i<=k)
        {
            ans+=x[i];
        }
        else
        {
            ans-=x[i];
        }
        //printf("ans: %lld\n",ans); 
    }
    printf("%lld\n",ans);
    return 0;
}

不要忘记开 long long 哦!