sort(1,2,3)快速排序+贪心(nlongn):今年暑假不AC

来源:互联网 发布:虎牙刷弹幕软件 编辑:程序博客网 时间:2024/05/18 08:30

今年暑假不AC

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

Input

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

output

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

sample input

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

sample output

5

分析:主要用于到sort快速排序和贪心算法

我们按结束时间从小到大排序,先结束的节目我们首先选择,然后用选择的这个节目的结束时间与下一个节目的开始时间做比较,如果下一个节目的开始时间大于这个节目的结束时间我们就再选择这一个,否则continue,依次循环。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

sort用法:sort(1,2,3)

其中1处:放入要排序的容器的首地址;2:放入要排序的容器的末地址;3:排序方法(可省略:默认从小到大排序)

头文件:#include<algorithm>

           using namespace std;

*****************************************************************************************************************************************************************************************

贪心算法:贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#include<stdio.h>
#include<algorithm>
using namespace std;
struct time
{
       int begin;
        int end;
}p[110];
bool cmp(time a,time b)    
//bool 布尔值,返回真或假bool:布尔型变量 ,其值只有 真 (true) 和假 (false)。
{
         return a.end <b.end ;             //布尔型变量可用于逻辑表达式,1.也就是“或”“与”“非”之类的逻辑运算
}                                                                   //和2.大于小于之类的关系运算,//逻辑表达式运算结果为真或为假
int main()
{
          int n,i,j,max;
          scanf("%d",&n);
          while(n!=0)
                {
                      for(i=0;i<n;i++)
                           scanf("%d%d",&p[i].begin ,&p[i].end );
                      sort(p,p+n,cmp);
                     max=p[0].end ;
                       int k=1;
                           j=0;
                    for(i=1;i<n;i++)
                          {
                                if(p[i].end==p[j].end )
                                   continue;
                                   else if(p[i].begin >=p[j].end )
                                             {
                                                    k++;
                                                      j=i;
                                              }
                              }
                     printf("%d\n",k);
                    scanf("%d",&n);
             }
return 0;
}

原创粉丝点击