1216: 复习!复习! [贪心]
时间限制: 1 Sec 内存限制: 128 MB提交: 108 解决: 32 统计
题目描述
马上到要放假了,也意味着马上要考试了。
王炸突然发现他只顾着学acm忘了学习功课,为了避免考试挂科,他决定进行一次复习以让更多的功课及格。
已知他现在有n门功课,每门功课都有一个开始复习和复习完毕的时间[st,endd)来表示。
求他最多可以复习多少门功课。
输入
数据的第一行输入一个整数T,表示数据的组数。(0 < T < 300)
以后的T组数据,第一行输入一个整数n(1 ≤ n ≤ 1000)
接下来的n行,每行两个整数st,endd(1 ~ 1e6 且 endd > st)
输出
输出一个整数,表示王炸最多能复习几门功课。
样例输入
2
3
1 2
2 4
3 4
2
1 100
100 200
样例输出
2
2
解析:
贪心算法,按照结束时间从小到大排序,判断下一个的开始时间是否大于等于前一个结束时间,如果是,计数加一;
否则就跳过这个数据继续判断。
程序如下:
#include<cstdio> #include<algorithm> using namespace std; struct stu { int st; int edd; }p[10003]; bool cmp(stu a,stu b) { return a.edd<b.edd; } int main() { int t; scanf("%d",&t); while(t--) { int n,i,j; int ans=1; scanf("%d",&n); for(i=0; i<n; i++) scanf("%d %d",&p[i].st,&p[i].edd); sort(p,p+n,cmp); for(i=0; i<n; i++) { if(p[i].st) for(j=i+1; j<n; j++) { if(p[j].st>=p[i].edd) { ans++; break; } else p[j].st=0; } } printf("%d\n",ans); } return 0; }