博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces730I Olympiad in Programming and Sports(姿势题 优先队列?dp?)
阅读量:6824 次
发布时间:2019-06-26

本文共 1961 字,大约阅读时间需要 6 分钟。

题意:

给你s(3000)个人,有两个社团,分别招收n和m(n+m<=s)个人,

每个人对这两个社团分别有一个自己的喜爱值(3000),

问怎样安排使得总的喜爱值最大,spj

思路:

如果n+m==s的话,裸的n^2的dp记一下前驱。。然而可以小于的话,

我除了n^3的就没有其他思路了。。。(弱就是弱)

看了看别人的代码,大概懂了,就是先把对第一个社团最喜爱的n个人放入,

然后对于第二个社团,每放一个人,就比较一下:

还没有加入社团的人(1)对第一个社团贡献最大的人的贡献+在第一个社团中的人(2)如果转到第二个社团所得到的最大贡献

和还没有加入这团的人(3)对第二个社团贡献最大的人的贡献做比较

如果前者大,就把(2)从第一个社团调到第二个社团,然后把(1)加入第一个社团

反之则把(3)加入第二个社团。

这样重复m次,就完成了

对于维护这三类,用三个优先队列吧。

/* ***********************************************Author        :devil************************************************ */#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long#define rep(i,a,b) for(int i=a;i<=b;i++)#define dep(i,a,b) for(int i=a;i>=b;i--)#define ou(a) printf("%d\n",a)#define pb push_back#define pii pair
#define mkp make_pair#define IN freopen("in.txt","r",stdin);#define OUT freopen("out.txt","w",stdout);using namespace std;const int inf=0x3f3f3f3f;const int mod=1e9+7;const int N=3e3+10;int s,n,m,a[N],b[N],c[N],ans;priority_queue
p1,p2,tmp;int main(){ scanf("%d%d%d",&s,&n,&m); for(int i=1;i<=s;i++) scanf("%d",&a[i]),p1.push(mkp(a[i],i)); for(int i=1;i<=s;i++) scanf("%d",&b[i]),p2.push(mkp(b[i],i)); while(n--) { int u=p1.top().second; p1.pop(); c[u]=1; ans+=a[u]; tmp.push(mkp(b[u]-a[u],u)); } while(m--) { while(!p1.empty()&&c[p1.top().second]) p1.pop(); while(!p2.empty()&&c[p2.top().second]) p2.pop(); if(p1.top().first+tmp.top().first>p2.top().first) { int u=p1.top().second,v=tmp.top().second; p1.pop();tmp.pop(); c[u]=1;c[v]=2; tmp.push(mkp(b[u]-a[u],u)); ans+=b[v]-a[v]+a[u]; } else { int u=p2.top().second; p2.pop(); c[u]=2; ans+=b[u]; } } printf("%d\n",ans); for(int i=1;i<=s;i++) if(c[i]==1) printf("%d ",i); printf("\n"); for(int i=1;i<=s;i++) if(c[i]==2) printf("%d ",i); return 0;}

 

转载于:https://www.cnblogs.com/d-e-v-i-l/p/6126662.html

你可能感兴趣的文章
SSO单点登录学习总结(1)——单点登录(SSO)原理解析
查看>>
Windows学习总结(12)——Windows 10系统开始运行-cmd命令大全
查看>>
单元测试过程
查看>>
新学的的matplotlib库~~~~
查看>>
【树形dp】vijos P1180 选课
查看>>
实验三
查看>>
Codeforces Round #363 (Div. 2)
查看>>
HDU 6141 - I am your Father! | 2017 Multi-University Training Contest 8
查看>>
日期操作
查看>>
angularjs中ng-repeat-start与ng-repeat-end用法实例
查看>>
如何在存储过程中自动添加分区
查看>>
20151124001 关闭C#主窗体弹出是否关闭对话框
查看>>
Groovy
查看>>
滑动窗口的最大值
查看>>
[转]BT常用渗透命令
查看>>
面向.Net程序员的前端优化
查看>>
HTTPS到底是个什么鬼?
查看>>
Yii框架中ActiveRecord使用Relations
查看>>
leetcode 55.跳跃游戏
查看>>
flexPaper +swftools实现文档在线阅读
查看>>