坑点:某些区间,out优先级队列会为空,这是不能出现out.top(),否则会出错
https://www.bnuoj.com/v3/problem_show.php?pid=35125
用优先级队列,实现每次都是in中的最小值和out中的最大值比较,而且交换后in马上重新排序,out:pop后不用push,因为push的数肯定不要再和in中的交换
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=2e2+5;
int a[maxn];
typedef long long ll;
struct cmp1
{
bool operator()(int& a,int& b)
{
return a>b;
}
};
struct cmp2
{
bool operator()(int& a,int& b)
{
return a<b;
}
};
int Swap(int n,int k,int l,int r)
{
priority_queue<int,vector<int>,cmp1> in;
priority_queue<int,vector<int>,cmp2> out;
int sum=0;
for(int i=0;i<n;i++)
{
if(i>=l&&i<=r)
{
in.push(a[i]);
sum+=a[i];
}
else
{
out.push(a[i]);
}
}
while(k--)
{
if(out.size()==0)
break;
if(out.top()>in.top())
{
sum=sum-in.top()+out.top();
int big=out.top();
int small=in.top();
in.pop();
out.pop();
in.push(big);
}
else
{
break;
}
}
return sum;
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int max=-INF;
int now;
for(int i=0;i<n;i++)
{
for(int p=i;p<n;p++)
{
now=Swap(n,k,i,p);
if(now>max)
{
max=now;
}
}
}
printf("%d\n",max);
return 0;
}10 2
10 -1 2 2 2 2 2 2 -1 10