HDU - 2037 今年暑假不AC

 题目地址:

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;
}


 

你可能感兴趣的:(c)