HDU 5360 Hiking 登山 (优先队列,排序)
题意:
有n个人可供邀请去hiking,但是他们很有个性,每个人都有个预期的人数上下限[Li,Ri],只有当前确定会去的人数在这个区间内他才肯去。一旦他答应了,无论人数怎样变更,他都不会反悔。问最多能邀请多少人去?输出邀请顺序(包括那些不去的人)。
思路:
有点像贪心法的《活动时间安排》?但是本题的人数是会变化的,会动态影响到后面的人的决策。
下面以“去邀请谁”作为一个决策。每次决策时,要考虑所有符合条件的人,其中对人数上限要求低的先挑,然后人数cnt++。在此次决策之后,可能又有人符合条件了,将这些人与前面剩下的人一块考虑,依然挑出那个对人数上限要求低的人,注意,随着cnt的增大,前面剩下的人之中也会出现一些不符合条件的了,这些人不予以考虑。
瓶颈在每次都要挑出那个对人数上限要求低的人,而这可以用堆来实现。所以总复杂度为O(nlogn)。
#include <bits/stdc++.h>
#define INF 0x7f7f7f7f
#define pii pair<int,int>
#define LL long long
using namespace std;
const int N=;
struct node
{
int down, up, pos;
node(){};
node(int down ,int up, int pos):down(down),up(up),pos(pos){};
bool operator <(const node &b) const
{
return up==b.up? down>b.down: up>b.up;
} //up小的在前面
}a[N];
inline int cmp(node a,node b){return a.down < b.down;} vector<int> ans;
int cal(int n)
{
sort(a, a+n, cmp); //按起始数字排序
priority_queue<node> que;
int left=, num=;
while(left<n || !que.empty() )
{
while(left<n && (num==a[left].down || que.empty()) )
que.push(a[left++]); //把符合条件的全部装进队列。或者队列为空时也必须装。 while( !que.empty() ) //处理队列中符合条件的,每次之多处理1个符合条件的。
{
node t=que.top();que.pop();
ans.push_back(t.pos); //无论是否能邀请到,都必须出来。 if( num>=t.down && num<=t.up )
{
num++; //一旦邀请到一个,num改变,可能又有符合条件的人要进队了。
break; //所以要退出,也许另一个着急的人才即将要进队。
}
}
}
return num;
} int main()
{
freopen("input.txt", "r", stdin);
int t, n;
cin>>t;
while(t--)
{
scanf("%d",&n);
ans.clear();
for(int i=; i<n; i++) scanf("%d",&a[i].down);
for(int i=; i<n; i++) scanf("%d",&a[i].up);
for(int i=; i<n; i++) a[i].pos=i+; printf("%d\n", cal(n));
for(int i=; i<ans.size(); i++) printf("%d ",ans[i]);
cout<<endl;
}
return ;
}
AC代码
HDU 5360 Hiking 登山 (优先队列,排序)的更多相关文章
- HDU 5360 Hiking(优先队列)
Hiking Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total S ...
- 2015多校第6场 HDU 5360 Hiking 贪心,优先队列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360 题意:给定n个人,现在要邀请这些人去远足,但每个人同意邀请的条件是当前已经同意去远足的人数c必须 ...
- hdu 5360 Hiking(优先队列+贪心)
题目:http://acm.hdu.edu.cn/showproblem.php? pid=5360 题意:beta有n个朋友,beta要邀请他的朋友go hiking,已知每一个朋友的理想人数[L, ...
- HDU 5360——Hiking——————【贪心+优先队列】
Hiking Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Su ...
- HDU 5360 Hiking(优先队列)2015 Multi-University Training Contest 6
Hiking Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total S ...
- 2015 Multi-University Training Contest 6 hdu 5360 Hiking
Hiking Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Su ...
- hdu - 1242 Rescue && hdu - 2425 Hiking Trip (优先队列+bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1242 感觉题目没有表述清楚,angel的朋友应该不一定只有一个,那么正解就是a去搜索r,再用普通的bfs就能过了 ...
- HDU 5360 Hiking (贪心)
题意:邀请 n 参加聚会,如果在邀请第 i 个人之前,已经成功邀请了 x 个人,并且 li <= x <= ri,那么第 i 人才会去,问你怎么排列使得邀请的人最多. 析:对于所有的人,按 ...
- 贪心+优先队列 HDOJ 5360 Hiking
题目传送门 /* 题意:求邀请顺序使得去爬山的人最多,每个人有去的条件 贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小,该人能 被邀 ...
随机推荐
- LCIS 最长公共上升子序列
这个博客好久没写了,这几天为了准备清华交叉研究院的夏令营,在复习大一大二ACM训练时的一些基础算法,正好碰到LICS,发现没有写在博客里,那就顺便记录一下好了. 参考链接:http://blog.cs ...
- Xamarin for Visual Studio 3.11.666 稳定版 破解补丁 Version 3
前提概要 1.全新安装请参考 安装 Xamarin for Visual Studio. 2.本次补丁包含: ① Xamarin for Visual Studio 3.11.666 ② Xamari ...
- zoj 3529 A Game Between Alice and Bob 博弈论
思路:每个数的SG值就是其质因子个数,在进行nim博弈 代码如下: #include<iostream> #include<cstdio> #include<cmath& ...
- js的正则表达式
正则表达式(regular expression)是一中描述字符模式的对象,js的RegExp类表示正则表达式,String与RegExp都定义了相应的方法来操作正则表达式,比如模式匹配,文本检索和替 ...
- Java IO(三)
File File类的常见方法: 1.创建. boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false.和输出流不一样,输出流对象一建立就创建文 ...
- vim中如何引用自定义模板文件
我们在使用vim新建文件时可以引用自定义模板,来避免重复的数据格式处理花费太多时间. 实现方法很简单,只需要2步即可:1. 在.vim/template目录放入自己的模板文件(如shellconfig ...
- 李洪强iOS开发之通知的使用
李洪强iOS开发之通知的使用 01 - 在A中发送通知 02 - 在B中监听通知 03 - 在B中通知出发的方法 04 - 在B控制器viewDidLoad调用通知
- linux rpm命令
1.rpm 是红帽(RedHat)软件包管理工具,实现类似于 Windows 中的添加/删除程序功能. 2.rpm -ivh 软件包名 安装软件包并显示安装进度.这个是用得最多的了. 3. rpm - ...
- JavaPersistenceWithHibernate第二版笔记-第五章-Mapping value types-007UserTypes的用法(@org.hibernate.annotations.Type、@org.hibernate.annotations.TypeDefs、CompositeUserType、DynamicParameterizedType、、、)
一.结构 二.Hibernate支持的UserTypes接口 UserType —You can transform values by interacting with the plain JD ...
- android-exploitme(五):不安全的数据存储
今天我来看看如果android将数据存储在sdcard,它的权限是什么样的 1. 打开emm软件,做一笔转账.