题目:
今年暑假不AC |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
Total Submission(s): 2608 Accepted Submission(s): 1407 |
|
Problem Description “今年暑假不AC?”
|
Input 输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
|
Output 对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
|
Sample Input 121 33 40 73 815 1915 2010 158 186 125 104 142 90
|
Sample Output 5
|
Author lcy
|
Source ACM程序设计期末考试(2006/06/07)
|
|
题目分析:
这是一道贪心的题目。对于这种“在线段不重合的情况下求同时共存的最大线段数”的题目,的贪心策略一般都是
:按终点升序排序。然后如果一条线段的起点比当前的策略计算出来的终点要大于||等于的话,则选择这条线段,并且更新最新的终点。
需要注意的是,这里使用到了结构体排序。定义结构体时尽量不要定义成类似于Time,time这样的名字。因为它里面
本身已经有一些这样的变量
代码如下:
/*
* b2.cpp
*
* Created on: 2015年1月29日
* Author: Administrator
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 105;
struct Node{
int start;
int end;
}node[maxn];
bool cmp(Node a,Node b){
if(a.end != b.end){
return a.end < b.end;
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF,n){
int i;
for(i = 0 ; i < n ; ++i){
scanf("%d%d",&node[i].start,&node[i].end);
}
sort(node,node+n,cmp);
int counter = 0;
int t = 0;
for(i = 0 ; i < n ; ++i){
if(t <= node[i].start){
counter++;
t = node[i].end;
}
}
printf("%d\n",counter);
}
return 0;
}