hdu2037 (区间贪心问题)

今年暑假不AC

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 15   Accepted Submission(s) : 4

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

“今年暑假不AC?”

“是的。”

“那你干什么呢?”

“看世界杯呀,笨蛋!”

“@#$%^&*%...”

确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。

作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)

Input

输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。

Output

对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。

Sample Input

12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0

Sample Output

5

Author

lcy

Source

ACM程序设计期末考试(2006/06/07)



Statistic | Submit | Back

一道关于区间的贪心问题。基本上涉及区间贪心的问题,都会经过排序。这道题也不例外。

这道题关键就是。

排序就是两种,要么根据开始时间排序,要么根据结束时间排序。

而根据开始时间排序是很显然不成立的。

比如

1 100

2 10

10 11

11 12

...

99 100

根据开始时间排序可能就只有1个了。而我们根据结束时间排序的话。很显然能安排更多的节目。为什么呢?

假设我们现在只讨论前2个节目。一个是1 5一个是2 3,我们是选择结束时间5 的还是3的呢?很明显,为了能够安排更多的节目

我们应该选择结束时间早的那个节目。。两个成立,n个也成立呀。。。附上代码吧~

#include <stdio.h>
#include <algorithm>
using namespace std;
struct node
{
	int star,end;
}c[105];
bool cmp(node a,node b)
{
	if(a.end<b.end) return true;
	if(a.end==b.end&&a.star<b.star) return true;
	return false;
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		if(n==0)
		break;
		for(int i=0;i<n;i++)
		scanf("%d %d",&c[i].star,&c[i].end);
		sort(c,c+n,cmp);
		int sum=1;
		for(int i=1;i<n;i++)
		{
			if(c[i].star>=c[i-1].end)
			sum++;
			else
			c[i].end=min(c[i].end,c[i-1].end);
		}
		printf("%d\n",sum);
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-10 21:38:26

hdu2037 (区间贪心问题)的相关文章

HDU 2037 今年暑假不AC (区间贪心)

题意:又是中文题... 析:先说一下区间贪心的一个定理,选择不相交的区间:数轴上有n个开区间(ai, bi).选择尽量多的区间,使得这些区间两两不相交,贪心策略是,一定是选bi小的.(想一下为什么). 知道这个的话,这个问题还不so easy!先对每个节目结束的时间排序,然后一个一个的选,保证没有相交,也就是说当前的开始时间一定要是上一个后面或者上一个刚结束当前就开始就OK了. 代码如下: #include <iostream> #include <cstdio> #include

POJ 3190 Stall Reservations-奶牛分栏(区间贪心,优先队列)

http://poj.org/problem?id=3190 题目大意:每一只奶牛要求在时间区间[A,B]内独享一个牛栏.问最少需要多少个牛栏. 贪心策略是优先满足A最小的奶牛,维持一个牛栏B最小堆,将新来的奶牛塞进B最小的牛栏里. <p><span style="color: rgb(51, 51, 51); font-family: 'Microsoft Yahei', 'Helvetica Neue', Helvetica, Arial, sans-serif; line

poj2376 Cleaning Shifts 区间贪心

题目大意: (不说牛了) 给出n个区间,选出个数最少的区间来覆盖区间[1,t].n,t都是给出的. 题目中默认情况是[1,x],[x+1,t]也是可以的.也就是两个相邻的区间之间可以是小区间的右端与大区间的左端相差1.这个是看题解才知道的. 解题思路: 贪心题的关键是找到贪心策略.但是这题的贪心策略没那么明显.并且贪心策略没有特定地去选择某一区间.这一题最重要的是要知道在什么情况下才需要增加一个区间. 首先是进行排序,按照区间的左端从小到大排序,左端相同的按照右端从小到大排. 从头开始遍历(只能

[总结] 三种常见的区间贪心问题

一.线段覆盖 n个开区间(ai,bi),选择尽量多个区间,使得这些区间两两不相交 右端点排序(<)兼顾左端点(>),再从左到右遇到不相交的就选 1 sort(he+1,he+n+1,cmp); 2 int tot=0,now=-1000; 3 for(int i=1; i<=n; i++) { 4 if(he[i].l>=now) now=he[i].r,tot++; 5 } 6 printf("%d", tot); 二.区间选点 n个闭区间[ai,bi],选择

poj1328 Radar Installation 区间贪心

题目大意: 在X轴选择尽量少的点作为圆心,作半径为d的圆.使得这些圆能覆盖所有的点. 思路: 把每个点都转化到X轴上.也就是可以覆盖这个点的圆心的位置的范围[a,b].然后按照每个点对应的a从小到大排序.第一点需要特殊处理,我们赋值r=b0 .也就是使得第一个圆的圆心的横坐标尽量大.然后遍历剩下的点.对于i点,如果该点的ai大于r, 就需要增加一个圆,圆心为bi :否则的话,把r更新为r与bi中小的值. 代码: 1 #include<iostream> 2 #include<cstdio

poj2376 Cleaning Shifts(区间贪心,理解题意)

https://vjudge.net/problem/POJ-2376 题意理解错了!!真是要仔细看题啊!! 看了poj的discuss才发现,如果前一头牛截止到3,那么下一头牛可以从4开始!!! 1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7

POJ 1089 Intervals【合并n个区间/贪心】

There is given the series of n closed intervals [ai; bi], where i=1,2,...,n. The sum of those intervals may be represented as a sum of closed pairwise non−intersecting intervals. The task is to find such representation with the minimal number of inte

nyoj891(区间上的贪心)

题目意思: 给一些闭区间,求最少须要多少点,使得每一个区间至少一个点. http://acm.nyist.net/JudgeOnline/problem.php?pid=891 例子输入 4 1 5 2 4 1 4 2 3 3 1 2 3 4 5 6 1 2 2 例子输出 1 3 1 题目分体: 区间贪心.我觉得区间上的贪心算法,最基本的还是排序的方式.仅仅要排序的方式合理.就能非常好的使用贪心,贪心的本质尽管是选择当前最优的解,作为全军最优解的一部分.假设排序不当回造成好的条件选择.本题仅仅给

三类贪心区间覆盖问题

一.区间完全覆盖问题 题目 给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖. 解析 先将所有线段按起点从小到大排序.排完序后,枚举每一个线段(被其它线段包含的线段不用考虑,因为很明显包含它的线段比它更优),将其作为最左端的线段, 再在剩下的左端点小于等于最左端的线段的右端点的线段中(若没有则无解),找到右端点最大的一个线段,即贪心,很显然这是最优的,因为其左端都被最左端的线段覆盖了, 也就没有覆盖到任何地方,则其右端点越大,其右