贪心算法 1050 2037

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


贪心算法 1050 2037_第1张图片

重叠累加后的效果如图:


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

#include 
#include 
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 
#include 
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)