POJ1083 MovingTables

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Fitz1318/article/details/86030150

题目链接:http://poj.org/problem?id=1083

大致题意:

公司有400个房间,如下编号对称分布在一条走廊两侧

1 3 5 ... 395 397 399

       走         廊

2 4 6 ... 396 398 400

现在要从房间i到房间j搬桌子。i--->j,有N组房间需要搬桌子,不论两个房间间隔多大,每搬一次十分钟。对于某组房间,搬桌子期间i-->j的走廊都会被占用,而其他组房间若没有使用到被占用的走廊,则可以同时搬,否则需要等待。这里需要注意的是像对面的两间房共用一段走廊。给定N组需要搬的桌子,求最小可以搬完的时间。

解题思路:①因为相对的两间房子共用一段走廊,所以可以统一转换为奇数房间号处理。

                 ②根据房间号对走廊进行分割,分割成200段走廊,从房间i到房间j搬桌子期间,对所使用的每段走廊计数+1。

                 ③等到所有桌子搬完后,统计每段走廊的计数值,将最大的计数值*10就是所求的最少时间。

AC代码:

#include <iostream>
using namespace std;

int toOdd(int i)
{
    return (i%2==0?i-1:i);
}

void solve()
{
    int num = 0;//搬动桌子的组数
    int UseNums[400] = {0};//每个房间前的走廊被使用的次数
    int MaxNums = 0;//被使用最多的次数
    int FromRooms[400] = {0};//起点房间集
    int ToRooms[400] = {0};//终点房间集
    cin >> num;
    for(int i=0; i<num; i++)
    {
        int from,to;
        cin >> from >> to;
        //将房间号小的放在前面
        FromRooms[i] = (from<=to?from:to);
        ToRooms[i] = (from<to?to:from);
        //将房间号全部转换成偶数
        FromRooms[i] = toOdd(FromRooms[i]);
        ToRooms[i] = toOdd(ToRooms[i]);
        //相关房间前占用的走廊被使用数加一
        for(int id=FromRooms[i]; id<=ToRooms[i]; id+=2)
        {
            UseNums[id]++;
            if(MaxNums<UseNums[id])
                MaxNums = UseNums[id];
        }
    }
    int time = MaxNums * 10;
    cout << time << endl;
}

int main()
{
    int TestCase = 0;
    cin >> TestCase;
    for(int i=0; i<TestCase; i++)
        solve();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Fitz1318/article/details/86030150
今日推荐