标签:des style blog io ar color os sp for
解题思路:即为给出一个总长度确定的区间,再输入不同的子区间,求在这个总区间里面包含的不相交的子区间最多有多少个。
可以由最特殊的情况来想,即给出的这些子区间现在都不相交,比如
----- (1,3) 1
---------- (2,4) 2
--------(5,7) 3
-----------------(8,10) 4
可以看到在0到10这个总的区间里面,一共有max=4个不相交的子区间,则从特殊到一般,如果我们将区间4向左移动,那么不相交的子区间的数目max变为3,就减少了1个,同理可得,如果移动其他子区间,都会导致max的值变小(该区间的移动导致它和另一个子区间相交)或者不变(该区间的移动不会导致与其他区间相交),则我们可以得出一般情况下最优解的情况就应该是类似最特殊的这种情况的形式。即最优解的情况应为,第二个子区间的起点大于第一个子区间的终点(用这个作为判断条件来遍历即可),这样保证它们是没有交点的,所以就要求这些子区间是有序的,将它们按照终点的从小到大的排序,可以从上述例子得到终点最小的区间一定是包含在最优解里面的,(因为它结束最晚,开始最早,一定排在经过排序后的区间的最左端)。
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 30024 Accepted Submission(s): 15884
#include<stdio.h> void bubblesort(int a[],int b[],int n) { int i,j,t; for(i=1;i<=n;i++) { for(j=i;j<=n-1;j++) { if(b[i]>b[j]) { t=b[i]; b[i]=b[j]; b[j]=t; t=a[i]; a[i]=a[j]; a[j]=t; } } } } int main() { int a[105],b[105],time; int n,i,j,sum; while(scanf("%d",&n)!=EOF&&n) { for(i=1;i<=n;i++) scanf("%d %d",&a[i],&b[i]);//a[]用来存放区间的起点,b[]用来存放区间的终点 bubblesort(a,b,n); sum=1; time=b[1]; for(j=1;j<=n;j++) { if(a[j]>=time) { sum++; time=b[j]; } } printf("%d\n",sum); } }
标签:des style blog io ar color os sp for
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4166175.html