poj3190区间类贪心+优先队列

题意:每个奶牛产奶的时间为A到B,每个奶牛产奶时要占用一间房子,问n头奶牛产奶共需要多少房子,并输出每头奶牛用哪间房子

分析:这题就是一个裸的贪心,将奶牛按开始时间进行排序即可,但考虑一下数据范围,我们可以用一个优先队列来进行维护,在优先队列中我们按照奶牛的结束时间最小构造小顶堆,然后判断新进来的元素的开始时间是否比最小的结束时间大,若是,加入队列,修改队列,若不是,加入对列,并且计数加1

注意自定义类型的优先队列的维护方法。详见:http://blog.sina.com.cn/s/blog_4e5157120100vn7b.html

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 const int maxn=50050;
15 //注意自定义类型在优先队列中的用法
16 typedef struct P
17 {
18     int start,over,id;
19     friend bool operator<(P a,P b)
20     {
21         return a.over>b.over; //小顶堆
22     }
23 }P;
24 P point[maxn];
25 bool cmp(P a,P b)
26 {
27     return a.start<b.start;
28 }
29 int t[maxn];
30 int main()
31 {
32     int n;
33     while(cin>>n)
34     {
35         for(int i=0;i<n;i++)
36         {
37             scanf("%d%d",&point[i].start,&point[i].over);
38             point[i].id=i;
39         }
40         memset(t,0,sizeof(t));
41         sort(point,point+n,cmp);
42         priority_queue<P> que;
43         int r=0; //统计个数
44         que.push(point[0]);
45         t[point[0].id]=++r;
46         for(int i=1;i<n;i++)
47         {
48             P node=que.top();
49             if(node.over<point[i].start){
50                 t[point[i].id]=t[node.id];
51                 que.pop();
52                 que.push(point[i]);
53             }
54             else{
55                 t[point[i].id]=++r;
56                 que.push(point[i]);
57             }
58         }
59         cout<<r<<endl;
60         for(int i=0;i<n;i++)
61             printf("%d\n",t[i]);
62     }
63     return 0;
64 }

时间: 2024-08-06 11:35:23

poj3190区间类贪心+优先队列的相关文章

poj3190Stall Reservations(贪心+优先队列)

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

总结#2----一类贪心问题

有n项任务,每项任务有一个报酬(可以为定值),还有一个最迟完成的时间,你完成一项任务需要特定的时间(可以为定值),求你最多可以获得多少报酬. 这类题目一般是贪心,而且一般是从后往前贪,不过有时需要做一些变换. 例如 1.wikioi1052地鼠游戏=bzoj1572工作安排 时间为定值1,报酬不同 每个时间点选取当前可做的最大的报酬的工作,从后往前,要注意当前队列为空时直接跳转到下一个有工作时间点 2.bzoj1029JSOI2007建筑抢修 报酬为定值,时间不同 排序了之后,从前往后能做则做,

poj 2431 Expedition (贪心+优先队列)

Expedition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6890   Accepted: 2065 Description A group of cows grabbed a truck and ventured on an expedition deep into the jungle. Being rather poor drivers, the cows unfortunately managed to

BZOJ 2151 种树 贪心+优先队列+HASH

题意:链接 方法:贪心+优先队列 解析: 首先裸上贪最大的肯定不对. DP可行么?可行,两个数组一个记录选一个记录不选好像差不多n^2? 不过还是想想贪心. 贪最大的为什么不对? 因为有可能它旁边的两个加起来比它更优越? 所以能否找到一点关系呢? 既然话都说到这了,两个加起来可能更优越. 所以我们在选了最大的之后是否应该回推一个值呢?代表选旁边俩. 我们发现选旁边俩是两个单位,选一个是一个单位,如果我们推回去某个值后这个值相当于对应删去一个单位选两个单位,即增加一个单位,这显然不会影响最终我们选

POJ1456Supermarket(贪心+优先队列)

Supermarket Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9103   Accepted: 3891 Description A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an int

[POJ1456]Supermarket(贪心 + 优先队列 || 并查集)

传送门 1.贪心 + 优先队列 按照时间排序从前往后 很简单不多说 ——代码 1 #include <queue> 2 #include <cstdio> 3 #include <iostream> 4 #include <algorithm> 5 #define N 10001 6 7 int n, t, ans; 8 std::priority_queue <int, std::vector <int>, std::greater &l

POJ 3190 Stall Reservations(贪心+优先队列优化)

Description Oh those picky N (1 <= N <= 50,000) cows! They are so picky that each one will only be milked over some precise time interval A..B (1 <= A <= B <= 1,000,000), which includes both times A and B. Obviously, FJ must create a reserv

区间型贪心总结(1)

1.选择不相交区间.数轴上有n个开区间(ai,bi).尽量选择多个区间,使得这些区间两两没有公共点. a.对区间进行排序,排序成b1<=b2<=b3<=.....的形式  b.第一个区间一定要选!  c. Case 1: a1 > a2 这种情况下选择1区间 Case 2: 排除Case 1后,一定有a1<=a2<=a3<=....., 此种情况应该选1区间,因为此时最优 题目:1214(CODEVS) 下面给出源码 1 //洛谷1214 线段覆盖 2 //区间型

hihoCoder 1309:任务分配 贪心 优先队列

#1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, EN ), 计算最少需要多少台机器才能按时完成所有任务. 同一时间一台机器上最多进行一项任务,并且一项任务必须从头到尾保持在一台机器上进行.任务切换不需要时间. 输入 第一行一个整数 N,(1 ≤ N ≤ 100000),表示任务的数目. 以下 N 行每行两个整数 Si, Ei,(0 ≤ Si <