题目传送门

 1 /*
 2     题意:求邀请顺序使得去爬山的人最多,每个人有去的条件
 3     贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小,该人能                 被邀请,而且不用考虑最少人数的条件。网上的写的比我简洁,学习了。
 4     详细解释:http://blog.csdn.net/queuelovestack/article/details/47319361
 5 */
 6 /************************************************
 7 * Author        :Running_Time
 8 * Created Time  :2015-8-6 14:51:47
 9 * File Name     :H.cpp
10  ************************************************/
11
12 #include <cstdio>
13 #include <algorithm>
14 #include <iostream>
15 #include <sstream>
16 #include <cstring>
17 #include <cmath>
18 #include <string>
19 #include <vector>
20 #include <queue>
21 #include <deque>
22 #include <stack>
23 #include <list>
24 #include <map>
25 #include <set>
26 #include <bitset>
27 #include <cstdlib>
28 #include <ctime>
29 using namespace std;
30
31 #define lson l, mid, rt << 1
32 #define rson mid + 1, r, rt << 1 | 1
33 typedef long long ll;
34 const int MAXN = 1e5 + 10;
35 const int INF = 0x3f3f3f3f;
36 const int MOD = 1e9 + 7;
37 struct Node {
38     int l, r, id;
39     bool operator < (const Node &x) const {
40         return r > x.r;
41     }
42 }node[MAXN];
43 priority_queue<Node> Q;
44 bool vis[MAXN];
45 int ans[MAXN];
46 int n;
47
48 bool cmp(Node x, Node y)    {
49     if (x.l == y.l) return x.r < y.r;
50     return x.l < y.l;
51 }
52
53 int main(void)    {     //HDOJ 5360 Hiking
54     int T;  scanf ("%d", &T);
55     while (T--) {
56         scanf ("%d", &n);
57         for (int i=1; i<=n; ++i)    {
58             scanf ("%d", &node[i].l);   node[i].id = i;
59         }
60         for (int i=1; i<=n; ++i)    {
61             scanf ("%d", &node[i].r);
62         }
63         sort (node+1, node+1+n, cmp);
64
65         if (node[1].l != 0) {
66             puts ("0");
67             for (int i=1; i<=n; ++i)    printf ("%d%c", i, (i==n) ? '\n' : ' ');
68             continue;
69         }
70         memset (vis, false, sizeof (vis));
71         while (!Q.empty ()) Q.pop ();
72         int i = 1, p = 0;
73         for (; i<=n && p==node[i].l; ++i)   Q.push (node[i]);
74         while (!Q.empty ()) {
75             while (!Q.empty ()) {
76                 if (p <= Q.top ().r)    {
77                     ans[++p] = Q.top ().id;
78                     vis[ans[p]] = true;    Q.pop ();   break;
79                 }
80                 else Q.pop ();
81             }
82             for (; i<=n && p==node[i].l; ++i)   Q.push (node[i]);
83         }
84
85         printf ("%d\n", p);
86         printf ("%d", ans[1]);
87         for (int i=2; i<=p; ++i)    {
88             printf (" %d", ans[i]);
89         }
90         for (int i=1; i<=n; ++i)    {
91             if (!vis[i])    printf (" %d", i);
92         }
93         puts ("");
94     }
95
96     return 0;
97 }

转载于:https://www.cnblogs.com/Running-Time/p/4709048.html

贪心+优先队列 HDOJ 5360 Hiking相关推荐

  1. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解

    思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...

  2. 1163 最高的奖励(贪心+优先队列)

    有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励.在结束时间之前完成该任务,就可以获得对应的奖励.完成每一个任务所需的时间都是1个单位时间.有时候完成所有任务是不可能的,因为时间上可能会有冲突 ...

  3. 贪心(优先队列) - New Year Snowmen - CodeForces - 140C

    贪心(优先队列) - New Year Snowmen - CodeForces - 140C 题意: 给定一个长度为n的正整数序列a1,a2,...,an.给定一个长度为n的正整数序列a_1,a_2 ...

  4. CodeForces 140C New Year Snowmen (贪心+优先队列)

    题意:n个数,选三个严格下降的数为一组,求最多能选多少组,并列出每组哪些数. 题解:贪心+优先队列 最多能选多少组,那么必须贪心数量多的. 例如:1 1 2 3 4 5 如果按照数的大小排序,只能贪到 ...

  5. CF140C New Year Snowmen(贪心+优先队列)

    CF140C 贪心+优先队列 贪心策略:每次取出数量最多的三种球,合成一个答案,再把雪球数都-1再插回去,只要还剩下三种雪球就可以不断地合成 雪球数用优先队列维护 #include <bits/ ...

  6. 【BHOJ 女娲加农炮 |、||】贪心 | 优先队列 | 堆 | E

    这次我们通过两道例题来总结一下优先队列的用法和实现: 目录: [BHOJ 1512]女娲加农炮 [BHOJ 1517]女娲加农炮II [BHOJ 1512]女娲加农炮 核心:贪心 + 优先队列 URL ...

  7. codeforces D. Fedor and coupons 贪心+优先队列

    题目地址:点击打开链接 D. Fedor and coupons time limit per test 4 seconds memory limit per test 256 megabytes i ...

  8. 小A与任务 (贪心 优先队列)

    题目链接:小A与任务 题意: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费 xi 的时间,同时完成第 i 个任务的时间不能晚于 ...

  9. LA 4254 Processor 处理器 【二分 贪心 优先队列】

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21663 二分: 最大值最小的问题通过二分来求解.对处理器速度进行 ...

最新文章

  1. 深入理解JVM(二)--垃圾收集算法
  2. 美国中学生被学校监控,实时位置、和谁接触一览无余
  3. SQL Story摘录(七)————触摸NULL值
  4. dp按照规模分类总结
  5. 中间表该怎么查询_「日语四级」日语四级准考证号忘了怎么查成绩
  6. leetcode python3 简单题121. Best Time to Buy and Sell Stock
  7. Spring Boot 学习系列(01)—从0到1,只需两分钟
  8. vue不是内部或外部命令_vue脚手架
  9. oracle ORA-00054 资源正忙
  10. STM32学习记录0004——ISP串口下载
  11. JavaScript实用手册
  12. 投资理财——如何选择基金
  13. J2ME学习过程中的一点心得整理(参考:java手机/PDA程序设计入门 王森)
  14. 关于 ELEMENTOR 的常见问题
  15. jsp页面适应手机屏幕_Jsp编写的页面如何适应手机浏览器页面
  16. ev4加密视频转mp4工具使用教程
  17. 高尔夫球场难度系数_在高尔夫球场上表现出色
  18. 压缩包文件如何将密码找回来
  19. 浩辰CAD看图王中如何一键替换CAD图纸中大量相同的文字?
  20. Asio的Buffer应该如何使用

热门文章

  1. springboot中缓存技术的使用、原理及其运行流程
  2. 猫和老鼠服务器维护多久结束,猫和老鼠手游关服公告 告别是为了每次更好的遇见!...
  3. 关于计算机游戏的英语读法,关于电脑游戏的英语作文
  4. hadoop安全模式
  5. 问题:pom文件飘红, parent.relativePath
  6. 使用jstack查看某个Java进程内的线程堆栈信息
  7. Netty核心组件总览
  8. html5+css3实战之-幽灵按钮
  9. 用awk 取出ifconfig eth0中IP的方法
  10. PHP选项、信息函数(转)