CF425A Sereja and Swaps
第一眼以为能用最大子段和
然后发现n很小,直接暴力
贪心取出最小加入最大即可。
#include<bits/stdc++.h>
using namespace std;
#define orz cout<<"lyakioi!!!!!!!!!!!!!!!!!"<<endl
inline int r(){int s=0,k=1;char c=getchar();while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}while(isdigit(c)){s=s*10+c-'0';c=getchar();}return s*k;}
int n,t,a[10001],ans=-1e9,s[10001];
int main()
{
n=r();t=r();
for(int i=1;i<=n;i++)a[i]=r();
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
int now=0;
priority_queue<int>q1;
priority_queue<int,vector<int>,greater<int> >q2;
for(int k=i;k<=j;k++)q2.push(a[k]),now+=a[k];
for(int k=1;k<i;k++)q1.push(a[k]);
for(int k=j+1;k<=n;k++)q1.push(a[k]);
for(int k=1;k<=t;k++)
{
if(q1.empty())break;
if(q2.empty())break;
int x=q1.top();
int y=q2.top();
if(x>y)
{
q1.pop();q2.pop();
now-=y;
now+=x;
}
else break;
}
ans=max(ans,now);
}
cout<<ans;
}
本文来自博客园,作者:lei_yu,转载请注明原文链接:https://www.cnblogs.com/lytql/p/15224313.html