2015-2016 ACM-ICPC Nordic Collegiate Programm…
2018-06-17 23:49:18来源:未知 阅读 ()
提交链接
http://codeforces.com/gym/100781/submit
Description:
Ada, Bertrand and Charles often argue over which TV shows to watch, and to avoid some of their fights they have finally decided to buy a video tape recorder. This fabulous, new device can record k different TV shows simultaneously, and whenever a show recorded in one the machine’s k slots ends, the machine is immediately ready to record another show in the same slot.
The three friends wonder how many TV shows they can record during one day. They provide you with the TV guide for today’s shows, and tell you the number of shows the machine can record simultaneously. How many shows can they record, using their recording machine? Count only shows that are recorded in their entirety.
Input
The first line of input contains two integers n, k (1 ≤ k < n ≤ 100 000). Then follow n lines, each containing two integers xi , yi , meaning that show i starts at time xi and finishes by time yi . This means that two shows i and j, where yi = xj , can be recorded, without conflict, in the same recording slot. You may assume that 0 ≤ xi < yi ≤ 1 000 000 000.
Output
The output should contain exactly one line with a single integer: the maximum number of full shows from the TV guide that can be recorded with the tape recorder.
Sample 1:
3 1
1 2
2 3
2 3
2
Sample 2:
4 1
1 3
4 6
7 8
2 5
3
Sample 3:
5 2
1 4
5 9
2 7
3 8
6 10
3
题意:输入n,k 表示有n场电视节目,最多可以同时录制k场,然后n行输入电视节目的起始时间和结束时间,注意(x1,y1) (x2,y2) y1==x2 不算重叠,求能录制的最多数量;
思路:定义多重集合 multiset<int>q; 插入k个0,表示同时录制时已经录制完部分电视节目的结束时间,把n个电视节目按结束时间排序,依次进行处理,如果当前电视节目的起始时间比集合中的k个数都要小,则表示当前节目不能放在k个节目任何一个节目后录制,则跳过;否则,在k个结束时间中找一个小于等于(最接近的,贪心原则)当前节目开始时间的值,然后删掉更新为当前节目的结束时间;
感悟:我做这道题时,一直没往这个方向想,唉,太智障了~
代码如下:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <set> using namespace std; struct Node { int s,e; }node[100005]; bool cmp(const Node x,const Node y) { if(x.e==y.e) return x.s>y.s; return x.e<y.e; } multiset<int>q; multiset<int>::iterator it; int main() { int n,k; while(scanf("%d%d",&n,&k)!=EOF) { q.clear(); for(int i=0;i<n;i++) scanf("%d%d",&node[i].s,&node[i].e); sort(node,node+n,cmp); for(int i=0;i<k;i++) q.insert(0); int sum=0; for(int i=0;i<n;i++) { it=q.upper_bound(node[i].s); if(it==q.begin()) continue; it--; q.erase(it); q.insert(node[i].e); sum++; } cout<<sum<<endl; } }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash