问题描述:
著名的ACM(Advanced Computer Maker)公司租用了一栋楼的楼层,形状如下图。
该楼层沿走廊的北侧和南侧各有200间客房。近期,公司制定了体制改革计划。改革包括在房间之间移动很多桌子。因为走廊很窄,所有的桌子都很大,所以只有一张桌子可以通过走廊。需要一些计划以使移动有效。经理想出了以下计划:将一张桌子从一个房间搬到另一个房间可以在 10 分钟内完成。将桌子从房间 i 移动到房间 j 时,使用房间 i 前面和房间 j 前面之间的走廊部分。因此,在每 10 分钟内,将同时在不共享走廊同一部分的两个房间之间进行多次移动。
对于每个房间,最多可以搬入或搬出一张桌子。现在,经理寻找一种方法来最小化移动所有桌子的时间。你的工作是编写一个程序来解决管理者的问题。
输入:
输入由 T 个测试用例组成。测试用例的数量)(T 在输入的第一行中给出。每个测试用例都以包含整数 N 的行开始,1<=N<=200,表示要移动的表的数量。每个接下来的N行包含两个正整数s和t,表示一张桌子要从房间号s移动到房间号t(每个房间号在N行中最多出现一次)。从第N+3行开始,其余测试用例以与上述相同的方式列出。
输出:
输出应包含完成移动的最短时间(以分钟为单位),每行一个。
样品输入
3
4
10 20
30 40
50 60
70 80
2
1 3
2 200
3
10 100
20 80
30 50
样本输入的输出
10
20
30
算法分析:找出最多的重叠次数,由题知把上下房间对着的看成一个地方,比如1 2看成都在1这个地方,3 4,都在2这个地方5 6都在3这个地方,用数组book【】记录出现每个数次数。比如样例2 的1 3,2 200,相当于book[1]=1,book[2]=2,book[3]=2,book[4]=1...book[200]=1,找出次数出现最大值,最后乘以10.
#include<stdio.h>
#include<string.h>
int main()
{
int t,n,i,j,d,book[210],k,m,m1,t1,max;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(book,0,sizeof(book));
d=10;max=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&m,&m1);
if(m>m1)
{
t1=m1;
m1=m;
m=t1;
}
m=(m+1)/2;
m1=(m1+1)/2;
for(k=m;k<=m1;k++)
book[k]++;
}
for(i=1;i<=200;i++)
{
if(book[i]>max)
max=book[i];
}
printf("%d\n",max*10);
}
return 0;
}
yjg