题目大意
著名的ACM(高级计算机制造商)公司租用了一栋建筑的地板,其形状如下。楼沿走廊的北侧和南侧各有200间客房。最近,公司制定了一项改革计划。改革包括在房间之间移动很多桌子。因为走廊很窄,所有的桌子都很大,只有一张桌子能穿过走廊。需要一些计划来提高移动效率。经理想出了以下计划:将桌子从房间移到另一个房间可以在 10 分钟内完成。将桌子从 I 房间移到 j 房间时,使用 I 房间前面和 j 房间前面之间的走廊部分。因此,每10分钟,在两个房间之间移动几个不共享走廊的同一部分将同时进行。为了清楚说明,经理说明了可能的情况和不可能同时移动的情况。对于房间,最多只能搬入或搬出一张桌子。现在,经理会寻找一种方法,以最大限度地减少移动所有表的时间。你的工作是编写一个程序来解决经理的问题。
解题思路:将搬运路线画成一条线,找出重叠度最高的,再乘以搬运时间;
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
int a,b;
while(n--)
{
int max=0;
int arr[200]={0};
int m;
cin>>m;
for(int i=0;i<m;i++)
{
cin>>a>>b;
a=(a-1)/2;
b=(b-1)/2;
if(a>b)
swap(a,b);
for(int j=a;j<=b;j++)
arr[j]++;
}
for(int i=0;i<200;i++)
if(arr[i]>max)
max=arr[i];
cout<<max*10<<endl;
}
return 0;
}
遇到的问题:忘记了搬运的桌子可以从房间序号大的搬运到序号小的,如果是从房间序号大的搬运到序号小的,应该对调一下;没注意房间是对立的,所以再确认路线时忘记了除以2;