本题有些陷阱需要注意:
- Input中的第一个房间号可能大于第二个房间号,若出现这种情况,则先交换房间号;
- 上下相对的两个房间无法同时搬运,所以若起始房间号为偶数,则减一;若终止房间号为奇数,则加一。
然后根据搬运路线的最大重叠次数,每次需要10分钟,即可计算出所需搬运时间。
#include <iostream>
using namespace std;
const int stepTime = 10; //每次搬运(重叠)所需的时间
const int MAX = 410;
int room[MAX];
int main()
{
int T, N, s, t;
cin >> T;
for (int i = 0; i < T; i++)
{
int time = 0;
memset(room, 0, sizeof(room));
cin >> N;
for (int j = 0; j < N; j++)
{
cin >> s >> t;
if (s > t) //若起始房间号大于终止房间号,则交换
{
int temp = s;
s = t;
t = temp;
}
if (s % 2 == 0) //若起始房间号为偶数,则减一
--s;
if (t % 2 == 1) //若终止房间号为奇数,则加一
++t;
for (int k = s; k <= t; k++) //当前路径上的房间重叠一次
room[k] += stepTime;
}
for (int j = 0; j < MAX; j++) //找出最大重叠次数
{
if (room[j] > time)
time = room[j];
}
cout << time << endl;
}
return 0;
}
继续加油。