hdu acm-step 1.3.1 Moving Tables

          本题题意是:有一个走廊以及200组互相对着的房间,现在要在不同的房间之间送信,但走廊一次只能通过一个人,因此一旦两个人的路线有重复的部分,那么

          就只能分两批走,送一次信要10分钟,现在给出n个人送信的路线,求他们所花的最少时间。

          代码如下:

          

#include <cstdio>

using namespace std;


int main()
{
    
    int T;

    scanf("%d",&T);

    while(T--)
    {

        int a[201] = {0};

        int n;

        scanf("%d",&n);
    
        int l,r;

        for(int i=0;i<n;i++)
        {

            scanf("%d%d",&l,&r);        

            l = (l + 1) / 2;

            r = (r + 1) / 2;
                
            if(l > r)
            {

                int t = l;

                l = r;

                r = t;

            }

            for(int i=l;i<=r;i++)
            {

                a[i]++;        

            }            

        }
                
        int max = 0; 

        for(int i=1;i<=200;i++)

            max = max > a[i] ? max : a[i];        

        printf("%d\n",max*10);

    }

    return 0;

}

其实仔细想想就会发现每两个相对的房间可以划分为1个区域,这样400个房间就能划分为200个区域。

然后再分析路线相交的情况有三种:"完全不相交,部分相交,重合"。

又发现三个人如果不是三人的路线都有重合,那么它们的时间是20。

仔细推理就可以发现只需要求每个人房间经过的人数,然后取其中最大值便是最短时间,因为总有m个人通过该房间,无论怎么调度,这m次是无法避免的。

我们只需要用数组模拟房间经过的人数,然后取最大值,便得到了结果。

需要注意的是,大编号房间到小编号房间时,注意交换两者的序号,否则for循环不会执行(TAT,之前还以为自己写错了,但怎么看逻辑都是对的)。

posted @ 2017-08-16 19:01  mtl6906  阅读(207)  评论(0编辑  收藏  举报