HDOJ_2037今年暑假不AC

                                                        今年暑假不AC

问题描述 :
“今年暑假不AC?”
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”

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

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

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

样例输入:

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

样例输出:

5

贪心思想:节目时间越早结束,能看的节目数量就越多


      由于输入的节目时间以其完成时间的非减序排列,所以算法greedySelector每次总是选择具有最早完成时间的相容节目加入集合A中。直观上,按这种方法选择相容节目为未安排节目留下尽可能多的时间。也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动
    算法greedySelector的效率极高。当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。如果所给出的活动未按非减序排列,可以用O(nlogn)的时间重排,用递归很容易造成超时。


代码实现如下:

#include<stdio.h>
struct Time
{
	int start;
	int end;
}a[255],t;         

int main()
{
	int i,j,n,count,time;
	while(scanf("%d",&n)&&n!=0)
	{
		count=0,time=0;  //count计算能观看节目的个数,time记录观看完一个节目的时间
		for(i=0;i<n;i++)
			scanf("%d%d",&a[i].start,&a[i].end);

		for(i=0;i<n-1;i++)          //对结束时间进行排序,节目时间结束越早就能观看更多的节目
			for(j=0;j<n-i-1;j++)
				if(a[j].end>a[j+1].end)
				{
					t=a[j];
					a[j]=a[j+1];   
					a[j+1]=t;
				}
  
				for(i=0;i<n;i++){    //从第一个最短节目结束时间开始一直遍历到最后一个,看看期间能有多少个符合题目条件
					if(time<=a[i].start){
						count++;
						time=a[i].end; //更新每次当前时间
					}
				}
				printf("%d\n",count);
	}
	return 0;
}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37243410/article/details/72793643
个人分类: 贪心 杭电HDOJ
上一篇HDOJ_1045Moving Tables(动表)
下一篇HDOJ_2111Saving HDU
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭