美文网首页
贪心算法 1050 2037

贪心算法 1050 2037

作者: 碧影江白 | 来源:发表于2016-08-31 16:04 被阅读21次

    1050 Moving Tables
    题目大意:
    题意:在一个长走廊里搬桌子,走廊的两侧都是房间,把桌子从一个房间搬到另外一个房间,走廊的宽度只能允许一个桌子通过,每次搬桌子需要10分钟(每一次允许再不交叉的走廊中同时搬桌子),问最少多长时间搬完。
    思路:
    不需要研究每次的前后房间号码,而可以简单地每次都根据房间号码在相应的数组内做出累加,得到的最大数目即为最长的时间。
    如图:有四个桌子要搬:


    重叠累加后的效果如图:


    最大的参数是3,那么也就是说最大的时间是3*10。
    依次类推,只要得到1~200单位的每一个使用次数便可:

    #include <stdio.h>
    #include <string.h>
    void main()
    {
        int A[201];
        int i,j,k,n,m;
        int a,b;
        scanf("%d",&n);
        while (n--)
        {
            memset(A,0,sizeof (A));
            scanf("%d",&m);
            while (m--)
            {
                scanf("%d%d",&a,&b);
                if (a>b)
                {
                    k=a;a=b;b=k;
                }
                if (a%2==1)
                    a=(a+1)/2;
                else
                    a=a/2;
                if (b%2==1)
                    b=(b+1)/2;
                else
                    b=b/2;
                for (i=a;i<=b;i++)
                    A[i]++;
            }
            int max=A[0];
            for (i=1;i<200;i++)
            {
                if(A[i]>max)
                    max=A[i];
            }
            printf ("%d\n",max*10);
        }
    }
    

    2037
    今年暑假不AC
    已知每个节目的开始时间和结束时间,求解每天能看到的最多电视节目个数:求最多个数,那么就是取尽量多节目时间短的,且在空闲的时间范围内选择。而方法则在于在已知当前的时间的情况下,找出最短结束时间的节目,该节目的结束时间可以更新为当前时间,继续寻找。

    #include <stdio.h>
    #include <string.h>
    void main()
    {
        int A[201];
        int i,j,k,n,m;
        int a,b;
        scanf("%d",&n);
        while (n--)
        {
            memset(A,0,sizeof (A));
            scanf("%d",&m);
            while (m--)
            {
                scanf("%d%d",&a,&b);
                if (a>b)
                {
                    k=a;a=b;b=k;
                }
                if (a%2==1)
                    a=(a+1)/2;
                else
                    a=a/2;
                if (b%2==1)
                    b=(b+1)/2;
                else
                    b=b/2;
                for (i=a;i<=b;i++)
                    A[i]++;
            }
            int max=A[0];
            for (i=1;i<200;i++)
            {
                if(A[i]>max)
                    max=A[i];
            }
            printf ("%d\n",max*10);
        }
    }
    

    相关文章

      网友评论

          本文标题:贪心算法 1050 2037

          本文链接:https://www.haomeiwen.com/subject/uhoqettx.html