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;
}
posted @ 2021-09-03 18:11  lei_yu  阅读(20)  评论(0编辑  收藏  举报