题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=2037
思路:用一个结构体tim来存时间段a,b 和他们的差sub (时间段的最小单位是1,比如 输入数据中1 3,则这个时间段为1~2,2~3,这个单位是什么不知道,反正不是小时,开始时我用的标记数组是按23(0~23小时)来的,后来提交上去显示AV,显然是数组开小了,一怒之下开到256,就乖乖的AC了)
然后对sub排序
从最小的时间段开始下手
设一个时间段标记数组flag[256],
flag[i] = false,表示这个时间段没被占用,如果 = true 表示被占用
然后对每一个时间段开始检测,当然是按sub排序后的顺序来,这样能使看到节目数量最大化
如果当前时间段里每个单位时间段都没被占用(flag[i] = false)
则总的可看节目数+1,然后把这段时间全部标记为true,这样处理一遍就OK了
最后输出totalcount,完事
/**
* Author: Gneveek
* Data: 2011-10-11
* Problem:2037
*/
#include<iostream>
using namespace std;
struct tim{
int sub,a,b;
}mytime[110];
int int_cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int main()
{
//freopen("C:\\in.txt","r",stdin);
int n;
bool mango[256]; //标记24个小时内,每个小时时间段是否已被占用
while(cin>>n, n!=0)
{
int totalcount = 0;
memset(mango,false,sizeof(mango));
for(int i=0; i<n; i++){
cin >> mytime[i].a >> mytime[i].b;
mytime[i].sub = mytime[i].b - mytime[i].a;
}
qsort(mytime,n,3*sizeof(int),int_cmp);
bool flag; //标记当前时间段是否可以完整观看
for(int i=0; i<n; i++)
{
flag = true;
for(int j=mytime[i].a; j<mytime[i].b; j++)
if(mango[j] == true){
flag = false;
break;
}
if(flag){
totalcount++;
for(int j=mytime[i].a; j<mytime[i].b; j++)
mango[j] = true;
}
}
cout << totalcount << endl;
}
return 0;
}