给出长度为N的一个序列,我们现在可以交换一对数字最多K次,问交换之后,最大的连续子序列的和。
思路:
观察到n和k都不大 ,我们可以O(n^2)枚举出连续子序列和的区间【L,R】,然后将区间内最小的值,和区间外最大的值不断进行交换,维护最大值即可。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int a[500];
int main()
{
int n,T;
while(~scanf("%d%d",&n,&T))
{
int output=-0x3f3f3f3f;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
priority_queue<int,vector<int>,less<int> >out;
priority_queue<int,vector<int>,greater<int> >in;
for(int k=1;k<=n;k++)
{
if(k>=i&&k<=j)
{
in.push(a[k]);
}
else out.push(a[k]);
}
int temp=T;
while(temp--)
{
if(out.size()==0||in.size()==0)continue;
int u=out.top();
int v=in.top();
if(u>v)
{
in.pop();out.pop();
out.push(v);in.push(u);
}
}
int sum=0;
while(!in.empty())
{
int u=in.top();
sum+=u;
in.pop();
}
output=max(output,sum);
}
}
printf("%d\n",output);
}
}