Spring VI C. Sereja and Swaps

题意: 求任意连续序列的最大值,这个连续序列可以和其他的值交换k次,求区间的最大值
思路: 我一开始始是想找到一段最大区间和,然后与之最近的区间和为正的话,就把二者之间的数交换成正数,结果就没有然后了
今天补题看到别人的思路是,暴力枚举每一段区间,然后用优先队列优化,

#include<bits/stdc++.h>
using namespace std;
int a[205],sum[205];
int main()
{
	int n,k;
	cin>>n>>k;
	int ans=0x3f3f3f3f;
	ans=-ans;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		sum[i]+=a[i]+sum[i-1];
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=i;j<=n;j++)
		{
			int tmp=sum[j]-sum[i-1];
			priority_queue<int>queMax,queMin;
			for(int q=1;q<i;q++)
			{
				queMax.push(a[q]);
			}
			for(int q=j+1;q<=n;q++)
			{
				queMax.push(a[q]);
			}
			for(int q=i;q<=j;q++)
			{
				queMin.push(-a[q]);
			}
			for(int q=1;q<=k;q++)
			{
				if(queMax.size()&&queMin.size())
				{
					if(queMax.top()+queMin.top()>0)
					{
						tmp+=queMax.top()+queMin.top();
						queMax.push(-queMin.top());
						queMin.push(-queMax.top());
						queMax.pop();
						queMin.pop();
					}
				}
				ans=max(ans,tmp);
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42819598/article/details/88855996
vi