任取一段作为基准,再从左面和右面剩余的部分中取出其中最大值与中间这一部分的最小值交换
其实有时暴力也是一种好方法,在当没有更好地方法之前,不妨暴力!
当然这不是重点
优先队列学习了
基本操作:
empty() 如果队列为空返回真
pop() 删除对顶元素
push() 加入一个元素
size() 返回优先队列中拥有的元素个数
top() 返回优先队列对顶元素
使用方法:
头文件:
#include <queue>
声明方式:
1、普通方法:
priority_queue
<
int
>
q;
// 通过操作,按照元素从大到小的顺序出队
// 通过操作,按照元素从大到小的顺序出队
2、自定义优先级:
struct
cmp
{
operator bool ()( int x, int y)
{
return x > y; // x小的优先级高
// 也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高
}
};
priority_queue < int , vector < int > , cmp > q; // 定义方法
// 其中,第二个参数为容器类型。第三个参数为比较函数。
{
operator bool ()( int x, int y)
{
return x > y; // x小的优先级高
// 也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高
}
};
priority_queue < int , vector < int > , cmp > q; // 定义方法
// 其中,第二个参数为容器类型。第三个参数为比较函数。
3、结构体声明方式:
struct
node
{
int x, y;
friend bool operator < (node a, node b)
{
return a.x > b.x; // 结构体中,x小的优先级高
}
};
priority_queue < node > q; // 定义方法
// 在该结构中,y为值, x为优先级。
// 通过自定义operator<操作符来比较元素中的优先级。
// 在重载”<”时,最好不要重载”>”,可能会发生编译错误
{
int x, y;
friend bool operator < (node a, node b)
{
return a.x > b.x; // 结构体中,x小的优先级高
}
};
priority_queue < node > q; // 定义方法
// 在该结构中,y为值, x为优先级。
// 通过自定义operator<操作符来比较元素中的优先级。
// 在重载”<”时,最好不要重载”>”,可能会发生编译错误
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <vector>
#include <stack>
using namespace std;
const int M=250;
int a[M],sum[M];
int main()
{
int n,k,i,j,m;
while(~scanf("%d%d",&n,&m))
{
sum[0]=0;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
int ans=-1e8;
for(i=1;i<=n;i++){
for(j=i;j<=n;j++){
int tmp=sum[j]-sum[i-1];
priority_queue<int>MAX,MIN;
for(k=1;k<i;k++)
MAX.push(a[k]);
for(k=j+1;k<=n;k++)
MAX.push(a[k]);
for(k=i;k<=j;k++)
MIN.push(-a[k]);
for(k=0;k<m&&!MAX.empty()&&!MIN.empty()&&MAX.top()+MIN.top()>0;k++){
tmp+=MAX.top()+MIN.top();
MAX.push(-MIN.top());
MIN.push(-MAX.top());
MIN.pop();
MAX.pop();
}
ans=max(ans,tmp);
}
}
printf("%d\n",ans);
}
}