题意: 求任意连续序列的最大值,这个连续序列可以和其他的值交换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;
}