[贪心+优先队列] hdu5360多校联合 第六场 Hiking
2015-08-07 10:15
417 查看
http://acm.hdu.edu.cn/showproblem.php?pid=5360
贪心的思路还是比较好想的,每次选择cur(已经邀请成功的人数)所在的区间中右端点最小的(因为右端点大的在后面可以邀请成功的几率大),然后很自然的想到可以用一个优先队列来维护这些区间,只要每次把左端点小于等于cur的区间放到优先队列中即可。
贪心的思路还是比较好想的,每次选择cur(已经邀请成功的人数)所在的区间中右端点最小的(因为右端点大的在后面可以邀请成功的几率大),然后很自然的想到可以用一个优先队列来维护这些区间,只要每次把左端点小于等于cur的区间放到优先队列中即可。
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<set> #include<vector> #include<map> #include<string> #include<iostream> #include<queue> using namespace std; int n; struct node { int l,r,id; friend bool operator < (node a, node b) { return a.r>b.r; } } a[100010]; int used[100010]; bool cmp(node a, node b) { return a.l<b.l; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=0; i<n; i++) scanf("%d",&a[i].l); for(int i=0; i<n; i++) { scanf("%d",&a[i].r); a[i].id=i+1; } sort(a,a+n,cmp); // for(int i = 0;i<n;i++) // printf("i = %d, L = %d, R = %d\n",i,a[i].l,a[i].r); priority_queue<node> que; vector<int> people; memset(used,0,sizeof used); int ans=0; int tot=0; while(tot<n || que.size()) { while(tot<n && a[tot].l<=ans) { que.push(a[tot]); tot++; } while(que.size() && que.top().r < ans) que.pop(); if(que.empty()) break; ans++; people.push_back(que.top().id); used[que.top().id]=1; que.pop(); } printf("%d\n",ans); int num=1; for(int i=0; i<people.size(); i++) { printf("%d%c",people[i],num==n?'\n':' '); num++; } for(int i=1; i<=n; i++) { if(used[i]==0) { printf("%d%c",i,num==n?'\n':' '); num++; } } } return 0; }
相关文章推荐
- poj解题报告——2419
- gulp VS grunk
- 南邮 OJ 1954 三位数素数判断
- 南邮 OJ 1952 贲神的故事2
- j2EE通用jar包的作用
- android学习笔记(2)EditText控件的学习
- WebRTC 音/视频模块学习中的 DirectSHow接口
- 数据结构之树状数组
- iphone-wireless ----- Iphone上扫描所有的无线网络
- 常用两种系统体系结构的比较
- IOS TableView详解(一)
- 在线制作gif loading图
- sublime text 3之快捷键操作
- Jboss 安装配置
- Linux下使用rsync最快速删除海量文件的方法
- leetcode_Majority Element II
- 信号屏蔽
- CocoaPods依赖库的使用
- 【Java设计模式】· 命令模式(Command Pattern)
- CListCtrl设置选中行