标签:nbsp 问题 描述 temp 开心 保存 它的 数据包 假设
解题思路
即为给出一个总长度确定的区间,再输入不同的子区间,求在这个总区间里面包含的不相交的子区间最多有多少个。
可以由最特殊的情况来想,即给出的这些子区间现在都不相交,比如
----- (1,3) 1
---------- (2,4) 2
--------(5,7) 3
-----------------(8,10) 4
可以看到在0到10这个总的区间里面,一共有max=4个不相交的子区间,则从特殊到一般,如果我们将区间4向左移动,那么不相交的子区间的数目max变为3,就减少了1个,同理可得,如果移动其他子区间,都会导致max的值变小(该区间的移动导致它和另一个子区间相交)或者不变(该区间的移动不会导致与其他区间相交),则我们可以得出一般情况下最优解的情况就应该是类似最特殊的这种情况的形式。即最优解的情况应为,第二个子区间的起点大于第一个子区间的终点(用这个作为判断条件来遍历即可),这样保证它们是没有交点的,所以就要求这些子区间是有序的,将它们按照终点的从小到大的排序,可以从上述例子得到终点最小的区间一定是包含在最优解里面的,(因为它结束最晚,开始最早,一定排在经过排序后的区间的最左端)。
#include<stdio.h> struct Time { int Ti_s; //开始时间 int Ti_e; //结束时间 }; int main() { int a,i,j,count; Time time[100],temp; //电视节目总数,结构体来表示 while(scanf("%d",&a)!=EOF&&a!=0) { for(i=0;i<a;i++) scanf("%d%d",&time[i].Ti_s,&time[i].Ti_e); //按照结束时间从小到大对节目进行排序 for(i=0;i<a;i++) for(j=i+1;j<a;j++) { if(time[i].Ti_e > time[j].Ti_e || (time[i].Ti_e == time[j].Ti_e && time[i].Ti_s > time[j].Ti_s ) ) { temp = time[i]; time[i] = time[j]; time[j] = temp; }//temp结构体它的开始时间保存着上一个节目的结束时间 } for(i=1,j=0,count=1;i<a;i++) { if(time[i].Ti_s>=time[j].Ti_e) { count++; j=i; } }//贪心算法,排序后的第一个节目肯定要看,然后依次计算下一个节目的开始时间大于等于上一个节目的结束时间的节目数 printf("%d\n",count); } return 0; }
标签:nbsp 问题 描述 temp 开心 保存 它的 数据包 假设
原文地址:https://www.cnblogs.com/1138720556Gary/p/11371910.html