贪心算法

今年暑假不AC

我见过两种算法:

1.按开始时间从大到小排序

/* 
这道题和南阳那道布置会场的题差不多一样,就是布置会场需要隔一个小时才能用,而这个题不需要 
,这个题因为是电视换台,到点了直接换台就行了!  
*/  
#include <stdio.h>  
#include <algorithm>  
using namespace std;  
  
struct node   
{  
    int t1;//电视开始时间   
    int t2;//电视的结束时间   
}a[105];   
  
int cmp(node u,node v)//对节目按照结束时间从小到大排序,如果结束的时间相同,则按照开始的   
{//时间从大到小的排序!   
    if(u.t2==v.t2)//为什么要将开始的时间从大到小排序呢?是因为如果结束时间相同的话,开始的   
        return u.t1>v.t1;//越迟,看节目的时间越短,你就能尽可能的多看电视!   
    return u.t2<v.t2;//例如:2-3,3-4,2-4,你肯定会看2-3,3-4的两个电视,而不看2-4这个电视   
}  
  
int main()  
{  
    int n,i,j,k,t;  
    while(scanf("%d",&n)&&n)  
    {  
        for(i=0;i<n;i++)//有n个开始和结束时间,将时间输入   
            scanf("%d%d",&a[i].t1,&a[i].t2);  
        sort(a,a+n,cmp);//对时间进行排序   
        for(i=1,t=a[0].t2,k=1;i<n;i++)//如果开始 的时间比他这个结束的时间迟,则就k++   
        {  
            if(a[i].t1>=t)//说明这个电视你能够看   
            {  
                t=a[i].t2;  
                k++;  
            }  
        }  
        printf("%d\n",k);//k代表能看的电视的个数!   
    }  
    return 0;  
}  

2.按结束时间从小到大排序

#include<stdio.h>  
#include<stdlib.h>  
  
struct Node  
{  
    int b,e;  
};  
int cmp(const void* a,const void* b)  
{  
    return (*(Node *)a).e > (*(Node *)b).e?1:-1;  
}  
Node ss[120];  
int main()  
{  
    int N,i,j,count;  
    while(scanf("%d",&N)&&N!=0)  
    {  
        for(i=0;i<N;i++)  
        {  
            scanf("%d%d",&ss[i].b,&ss[i].e);  
        }  
        qsort(ss,N,sizeof(ss[0]),cmp);  
 //       for(i=0;i<N;i++)  
   //     printf("%d %d\n",ss[i].b,ss[i].e);  
        count=1;  
        int k;  
        k=ss[0].e;  
        for(i=1;i<N;i++)  
        {  
            if(k<=ss[i].b)  
            {  
                k=ss[i].e;  
                count++;  
            }  
        }  
        printf("%d\n",count);  
    }  
    return 0;  
}  
点赞