zoukankan      html  css  js  c++  java
  • HDU 2037 今年暑假不AC

    今年暑假不AC

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 11630    Accepted Submission(s): 5990


    Problem Description
    “今年暑假不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
     
     
     
     
    贪心题。类多个开区间,求最多的不重叠区间。
     
    右端从小到大排序,最小的必选。
    这里右2个代码,第一个是开始是自己写的,排序后,最小的必选,然后把有重叠的删掉。
    第二个看别人的报告的,排序后,先选并标记最小的那个,然后向后扫描,当发现右不重叠的+1,并且标记,再扫描后面的和刚刚标记的比较来找不重叠的。
     
     
    第一个代码:
    View Code
     1 #include<stdio.h>
    2 #include<stdlib.h>
    3 struct xoy
    4 {
    5 int left;
    6 int right;
    7 int flag;
    8 }tv[110];
    9 int cmp(const void *a,const void *b)
    10 {
    11 return ((xoy*)a)->right - ((xoy*)b)->right;
    12 }
    13
    14 int main()
    15 {
    16 int n,i,j,count;
    17 while(scanf("%d",&n)==1&&n)
    18 {
    19 for(i = 0;i < n; i++)
    20 {
    21 scanf("%d%d",&tv[i].left,&tv[i].right);
    22 tv[i].flag = 1;//假设都看。
    23 }
    24 qsort(tv,n,sizeof(tv[0]),cmp);
    25 for(i = 0;i < n; i++)
    26 {
    27 if(tv[i].flag)//从小到大如果看。
    28 {
    29 for(j = i + 1;j < n;j++)//往后扫描、
    30 {
    31 if(tv[j].left < tv[i].right)//如果有重叠。
    32 {
    33 tv[j].flag = 0;//删掉。
    34 }
    35 }
    36 }
    37 }
    38 count = 0;
    39 for(i = 0;i < n; i++)//上面处理完后,重新扫描,tv[i].flag == 1的都是看的。
    40 {
    41 if(tv[i].flag)
    42 {
    43 count++;
    44 }
    45 }
    46 printf("%d\n",count);
    47 }
    48 return 0;
    49 }
     
     
     
     
     
     
     
    第二个代码:
    View Code
     1 #include<stdio.h>
    2 #include<stdlib.h>
    3 struct xoy
    4 {
    5 int left;
    6 int right;
    7 }tv[110];
    8 int cmp(const void *a,const void *b)
    9 {
    10 return ((xoy*)a)->right - ((xoy*)b)->right;
    11 }
    12
    13 int main()
    14 {
    15 int n,i,count,flag;
    16 while(scanf("%d",&n)==1&&n)
    17 {
    18 for(i = 0;i < n; i++)
    19 {
    20 scanf("%d%d",&tv[i].left,&tv[i].right);
    21
    22 }
    23 qsort(tv,n,sizeof(tv[0]),cmp);
    24 count = 1;
    25 flag = 0;//记录第一个必选的。
    26 for(i = 1;i < n; i++)
    27 {
    28 if(tv[flag].right <= tv[i].left)//当找到新的符合的。
    29 {
    30 count++;
    31 flag = i;//记录他位置。因为下一个要和他比较,才知道是不是符合。
    32 }
    33 }
    34 printf("%d\n",count);
    35 }
    36 return 0;
    37 }
     
     
  • 相关阅读:
    #pragma 预处理指令
    C++类继承中的构造函数和析构函数 调用顺序
    static_cast与dynamic_cast转换 最简单的理解
    std::map的insert和下标[]访问
    C++有没有string转化int的函数,怎样转换
    c++中在一个类中定义另一个只有带参数构造函数的类的对象
    c++二进制文件的读写
    C++ 包含头文件 和 宏的使用 和 条件编译
    C++ 前置声明 和 包含头文件 如何选择
    C语言 gets()和scanf()函数的区别
  • 原文地址:https://www.cnblogs.com/qiufeihai/p/2322179.html
Copyright © 2011-2022 走看看