hdu 5360 贪心+优先队列

贪心的思路还是比较好想的,每次选择cur(已经邀请成功的人数)所在的区间中右端点最小的(因为右端点大的在后面可以邀请成功的几率大),然后很自然的想到可以用一个优先队列来维护这些区间,只要每次把左端点小于等于cur的区间放到优先队列中即可。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <vector>
 5 #include <queue>
 6 using namespace std;
 7
 8 const int N = 100001;
 9 bool visit[N];
10 int a[N];
11
12 struct Node
13 {
14     int r, id;
15     Node(){}
16     Node( int _r, int _id )
17     {
18         r = _r, id = _id;
19     }
20     bool operator < ( const Node & o ) const
21     {
22         return r > o.r;
23     }
24 };
25
26 vector<Node> v[N];
27 priority_queue<Node> q;
28
29 int main ()
30 {
31     int t;
32     scanf("%d", &t);
33     while ( t-- )
34     {
35         int n;
36         scanf("%d", &n);
37         for ( int i = 0; i <= n; i++ )
38         {
39             v[i].clear();
40         }
41         for ( int i = 1; i <= n; i++ )
42         {
43             scanf("%d", a + i);
44         }
45         for ( int i = 1; i <= n; i++ )
46         {
47             int tmp;
48             scanf("%d", &tmp);
49             v[a[i]].push_back( Node( tmp, i ) );
50         }
51         memset( visit, 0, sizeof(visit) );
52         int cur = 0, cnt = 1;
53         while ( 1 )
54         {
55             for ( int i = 0; i < v[cur].size(); i++ )
56             {
57                 q.push(v[cur][i]);
58             }
59             bool flag = false;
60             while ( !q.empty() )
61             {
62                 Node tt = q.top();
63                 q.pop();
64                 a[cnt++] = tt.id;
65                 visit[tt.id] = true;
66                 if ( tt.r >= cur )
67                 {
68                     cur++;
69                     flag = true;
70                     break;
71                 }
72             }
73             if ( !flag )
74             {
75                 break;
76             }
77         }
78         for ( int i = 1; i <= n; i++ )
79         {
80             if ( !visit[i] )
81             {
82                 a[cnt++] = i;
83             }
84         }
85         printf("%d\n", cur);
86         for ( int i = 1; i < n; i++ )
87         {
88             printf("%d ", a[i]);
89         }
90         printf("%d\n", a[n]);
91     }
92     return 0;
93 }
时间: 2024-10-15 12:37:50

hdu 5360 贪心+优先队列的相关文章

hdu 5360 Hiking(优先队列+贪心)

题目:http://acm.hdu.edu.cn/showproblem.php? pid=5360 题意:beta有n个朋友,beta要邀请他的朋友go hiking,已知每一个朋友的理想人数[L,R](现有L~R个人准备去,那么这个朋友就去). 求最多有多少人去. 及beta邀请朋友的顺序. 分析:每次邀请人的最优解就是:选会去的人里面R最小的那个人. 代码实现的话,cur代表已经准备go hiking的人数,每次将全部L<=cur的人放进优先队列,选出R最小的那个. 假设队列为空,那么剩下

hdu 5360 贪心

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <cmath> #include <cstring> #include <stack> #include <set> #include <map> #include <vector> using namespace st

HDU 5360(2015多校6)-Hiking(优先队列)

题目地址:HDU 5360 题意:给定n个人,现在要邀请这些人去远足,但每个人同意邀请的条件是当前已经同意去远足的人数c必须满足c>=l[i]&&c<=ri,问你邀请的顺序是什么才能使尽可能多的人去远足,若有多个最优解,输出任意的一个. 思路:先按照L从小到到排序,把当前符合的L放入优先队列中 ,然后对队列中的R从小到大排序,贪心的选择R小的,然后乱搞一番就可以了. #include <stdio.h> #include <math.h> #includ

poj3190Stall Reservations(贪心+优先队列)

题目链接: 啊哈哈,点我点我 思路: 首先根据挤奶时间的先后顺序排序...然后将第一头牛加入优先队列..然后就是加入优先队列的牛应该根据越早结束挤奶那么优先级更高,如果时间结束点相等,那么开始时间早的优先级高... 然后从前向后枚举.如果碰到有牛的挤奶时间的开始值大于优先队列的首部的结束值,那么说明这两头牛可以一起公用一个挤奶房..然后从优先队列中删除这头牛..那么这个问题就得到解决了... 题目: Language: Default Stall Reservations Time Limit:

hdu 4105 贪心思想

淋漓尽致的贪心思想 波谷一定是一位数,波峰一位数不够大的时候添加到两位数就一定够大了的. 当在寻找波谷碰到零了就自然当成波谷. 当在寻找波峰时碰到零时,将前面的波谷加到前一个波峰上,让当前的零做波谷,使得波谷的值尽量小,这就是本题最关键的贪心思想,一直想不到. 代码中:a表示前一个值,b表示当前考虑的值,tag为偶数时表示正在寻找波谷,奇数时在寻找波峰. #include<iostream> #include<cstdio> #include<cstring> #inc

HDU 4923 (贪心+证明)

Room and Moor Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0 or 1. In order to beat him, programmer Moor has to construct another sequence B = {B1, B2,... , BN} of the same length, which satisfies that:

HDU 1242 Rescue(优先队列+bfs)

题目地址:HDU 1242 这个题相比于普通的bfs有个特殊的地方,经过士兵时会额外消耗时间,也就是说此时最先搜到的时候不一定是用时最短的了.需要全部搜一遍才可以.这时候优先队列的好处就显现出来了.利用优先队列,可以让队列中的元素按时间排序,让先出来的总是时间短的,这样的话,最先搜到的一定是时间短的,就不用全部搜一遍了.PS:我是为了学优先队列做的这题..不是为了这题而现学的优先队列.. 代码如下: #include <iostream> #include <stdio.h> #i

hdu 2037 贪心

今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 27361    Accepted Submission(s): 14439 Problem Description "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋!" &quo

HDU 4932 贪心

Miaomiao's Geometry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 191    Accepted Submission(s): 38 Problem Description There are N point on X-axis . Miaomiao would like to cover them ALL by