优先级队列

来源:互联网 发布:东莞cnc编程学徒招聘 编辑:程序博客网 时间:2024/05/20 13:19

坑点:某些区间,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 0x3f3f3f3fusing 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 210 -1 2 2 2 2 2 2 -1 10


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2岁宝宝迷上手机怎么办 2岁宝宝说话口吃怎么办 两岁宝宝突然口吃怎么办 两岁半的宝宝还不会说话怎么办 2岁宝宝自闭症怎么办呀 新生儿又吐又拉怎么办 一岁多宝宝受凉呕吐拉稀怎么办 7个月的宝宝腹泻怎么办 两岁宝宝拉稀水怎么办 2岁宝宝发烧呕吐怎么办 1岁宝宝着凉呕吐怎么办 2岁着凉了呕吐怎么办 2岁宝宝着凉呕吐怎么办 两岁宝宝偏矮怎么办 2岁宝贝吐没精神怎么办 11个月的宝宝吐怎么办 二岁的宝宝吐了怎么办 十个月小孩吐了怎么办 10个月宝宝呕吐怎么办 小孩又拉又吐的怎么办 小孩子不吃饭呕吐拉肚子怎么办 小孩发烧后又吐怎么办 11个月宝宝吐了怎么办 11个月宝宝拉肚子怎么办 2岁宝宝反复呕吐怎么办 1岁半幼儿拉肚子怎么办 宝宝打嗝呕吐胃难受怎么办 3岁宝宝发烧还吐怎么办 孩子喝水都吐怎么办啊 宝宝吃多了呕吐怎么办 3岁宝宝吐怎么办才好 儿童受凉肚子疼发热呕吐怎么办 两岁宝宝半夜呕吐怎么办 两岁宝宝吐了怎么办 2岁宝宝发烧吐怎么办 2岁多宝宝呕吐是怎么办 2周岁宝宝中暑了怎么办 2岁半宝宝着凉呕吐怎么办 3岁宝宝吐了几次怎么办 一岁宝宝恶心吐怎么办 9个月宝宝一直吐怎么办