Moving Tables

今天AC了另一道比较有趣的题目~

题目链接: 题目

房间结构如下:
Alt text

搬桌子规则如下:
Alt text

解题思路:
首先,可以先仔细地看题,我们可以从题目中看出,这是一个400个房间,奇数号房间和偶数号房间相对,走廊只允许通过一张桌子且将桌子从一间房搬到另一间房间所花的时间为10mins。
仔细考虑题目,我们可以知道每两个房间(奇房间和相对应的偶房间)共享一块走廊区域,于是可以很清晰地将400个房间划分为200组。
根据题意,我们需要求出最小的搬运时间。这里需要注意的是,我们如果使用了集合区间的包含关系来划分各个房间时,会掉进一个误区。在这里,我们很清楚地知道,无交集的两个集合可以看作是两个房间互不影响。那么是不是只要不断地检测互不影响的组数,将其归为一类,就能知道最短的时间呢?
答案是否定的,在这里,我们可以假设,有三张桌子要进行搬运,其中分别为:1号搬到10号,11号搬到13号,14号搬到29号。显然,1-10和11-13互不影响,也同14-29互不影响,而11-13却是和14-29存在影响的。当我们将它们归为一组,那么答案显然不是题目要求的“最短”所需时间。所以这种方法并不理想。(卡了我挺久。。。)
因此,我们将搬桌子这个过程进行一定地抽象,可以看作是进行两个组之间地连线。那么,显然,当存在有两条线相交时,他们会相互影响,导致时间增加。那么此问题就可以简化为求出最多有多少条线相交于同一点(即同一块走廊区域)。

代码如下:

#include <iostream>
using namespace std;
void max1(int &a,int &b)
{
    int k;
    if (a>b)
    {
        k=a;
        a=b;
        b=k;
    }
}
int main()
{
    int t,n,flag,s,u,maxx;
    int count1;
    cin>>t;
    while(t--)
    {
    maxx=0;
    int x[201]={0};
    cin>>n;
    while(n--)
    {
        cin>>s>>u;
        max1(s,u);
        s=(s+1)/2;
        u=(u+1)/2;
        for(int j=s;j<=u;j++)
                 x[j]++;
    }

    for(int i=1;i<=200;i++)
    {
        if(maxx < x[i])
                maxx=x[i];
    }
    count1=10*maxx;
    cout<<count1<<endl;
    }
    return 0;
}