【1050】Moving Tables
搬桌子
贪心
该层楼的南北两边沿走廊各有200个房间。最近,该公司制定了改革制度的计划。改革的内容包括在房间之间移动大量的桌子。因为走廊很窄,而所有的桌子都很大,所以只有一张桌子可以通过走廊。需要制定一些计划,使移动的效率提高。经理想出了以下计划。把一张桌子从一个房间搬到另一个房间可以在10分钟内完成。从i号房间搬到j号房间的时候,i号房间前面和j号房间前面之间的走廊部分被利用。因此,在每10分钟内,在两个不在同一走廊的房间之间会同时进行几次移动。为了让大家明白,经理说明了同时移动的可能情况和不可能情况。
每个房间,最多只能搬进或搬出一张桌子。现在,经理寻求一种方法,以尽量缩短移动所有桌子的时间。你的工作是编写一个程序来解决经理的问题。
输入内容
输入由T个测试用例组成。测试用例的数量)(T在输入的第一行给出。每一个测试用例的开头都有一行包含一个整数N ,1<=N<=200
,代表要移动的表的数量。下面的N行中,每一行都包含两个正整数s和t,代表一个表要从房间号s移动到房间号t(每个房间号在N行中最多出现一次)。从第N+3行开始,其余的测试用例与上述方式相同。
輸出
输出的内容应包含完成搬家的最短时间,以分钟为单位,每行一个。
通过www.DeepL.com/Translator(免费版)翻译
Sample Input
3
4
10 20
30 40
50 60
70 80
2
1 3
2 200
3
10 100
20 80
30 50
Sample Output
10
20
30
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,s,n,T;
int mo[210];
scanf("%d",&T);
while(T--)
{
memset(mo,0,sizeof(mo));//初始化
scanf("%d",&n);//要移动的桌子
for(int i=0;i<n;i++)
{
scanf("%d%d",&s,&t);//从s到t
s=(s-1)/2;
t=(t-1)/2;
if(s>t)
{
swap(s,t);//交换st数值
}
for(int i=s;i<=t;i++)
{
mo[i]++;//经过次数
}
}
int maxn=0;
for(int i=0;i<200;i++)
{
if(mo[i]>maxn)//最大的数组值即为移动完桌子所需的最短时间
{
maxn=mo[i];
}
}
printf("%d\n",maxn*10);//十分钟一次
}
return 0;
}