版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}