zoukankan      html  css  js  c++  java
  • 非洲孩子

    第一部分:题目

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1036

    描述

    家住非洲的小孩,都很黑。为什么呢?
    第一,他们地处热带,太阳辐射严重。
    第二,他们不经常洗澡。(常年缺水,怎么洗澡。)
    现在,在一个非洲部落里,他们只有一个地方洗澡,并且,洗澡时间很短,瞬间有木有!!(这也是没有的办法,缺水啊!!)
    每个小孩有一个时间段能够洗澡。并且,他们是可以一起洗的(不管你是男孩是女孩)。
    那么,什么时间洗澡,谁应该来洗,由谁决定的呢?那必然是他们伟大的“澡”神啊。“澡”神有一个时间表,记录着该部落的小孩,什么时候段可以洗澡。现在,“澡”神要问你,一天内,他需要最少开启和关闭多少次洗澡的水龙头呢?因为,开启和关闭一次水龙头是非常的费力气的,即便,这也是瞬间完成的。

     
    输入
    多组数据
    第一行一个0<n<=100。
    接下来n行,每行一个时间段。H1H1:M1M1-H2H2:M2M2,24小时制。
    保证该时间段是在一天之内的。但是,不保证,H1H1:M1M1先于H2H2:M2M2。
    输出
    题目描述,“澡”神最少需要开启和关闭多少次水龙头呢?
    样例输入
    1
    00:12-12:12
    2
    00:12-12:12
    14:00-12:00
    样例输出
    1
    1

    第二部分:思路

    要点:1,瞬间洗完就意味着寻找区间公共点。找最少的点能够涉及所有区间。

    2,以结束时间为基准,就是按照结束时间从小到大排序

    第三部分:所犯错误

    1,一开始没有正确理解题目瞬间洗完的意思,以为在时间段内可以一直洗澡呢,呵呵

    2,排序时一开始是按照起始时间从小到大排序的,实际上应该以结束时间为基准,如果不明白,画个图就清楚了

    第四部分:ac代码 

    #include<stdio.h>
    int main()
    {
        int n,a,b,c,d;
        int s[105][2];
        char x,y,z;
        while(scanf("%d",&n)!=EOF)
        {
            int len=0;
            while(n--)
            {
                scanf("%d%c%d%c%d%c%d",&a,&x,&b,&y,&c,&z,&d);
                a=a*100+b;//把起始时间和结束时间转换成数值,方便计算 
                b=c*100+d;            
                if(a>b)//调整起始时间<=结束时间 
                {
                    int t=a;
                    a=b;
                    b=t;    
                }
                s[len][0]=a;//用数组存储时间 
                s[len++][1]=b;
            }
            int i,j;
            //这里关键:按照结束时间从小到大排序
            for(i=0;i<len-1;i++) 
            {
                for(j=i+1;j<len;j++)
                {
                    if(s[i][1]>s[j][1])
                    {
                        int l;
                        for(l=0;l<2;l++)
                        {
                            int t=s[i][l];
                            s[i][l]=s[j][l];
                            s[j][l]=t;
                        }
                    }
                }
            }
            int count=0;
            count++;
            int end;
            //从头开始,因为后面的结束时间大于等于当前结束时间,所以只要起始时间不超过结束时间就
            //可以一起瞬间洗完澡。如果起始时间大于截止时间那就是另外一组人洗了。 
            end=s[0][1];
            for(j=1;j<len;j++)
            {
                if(s[j][0]>end)
                {
                    end=s[j][1];
                    count++;
                }
                if(s[j][1]<end)
                {
                    end=s[j][1];
                }
            }
            printf("%d
    ",count);
        }
        return 0;
        
    } 
  • 相关阅读:
    2012年浙大:Hello World for U
    noip2011普及组:统计单词
    noip2013提高组:积木大赛
    蓝桥杯:错误票据
    C#知识点
    疑问
    C#多态
    SQLServer导入Excel,复杂操作
    SQLServer数据库基本操作,导入Excel数据
    C#基础学习
  • 原文地址:https://www.cnblogs.com/xiangguoguo/p/5419066.html
Copyright © 2011-2022 走看看