参考一位大神的代码,代码十分简洁好理解
题意:在一个狭窄的走廊里将桌子从一个房间移动到另一个房间,走廊的宽度只能允许一个桌子通过。给出t,
表示有t组测试数据。再给出n,表示要移动n个桌子。n下面有n行,每行两个数字,表示将桌子从a房间
移到b房间。走廊的分布图如一图所示,每移动一个桌子到达目的地房间需要花10分钟,问移动n个桌子
所需要的时间。
解题思路:若移动多个桌子时,所需要经过的走廊没有重合处,即可以同时移动。若有一段走廊有m个桌子都
要经过,一次只能经过一个桌子,则需要m*10的时间移动桌子。设一个数组,下标值即为房间号。
桌子经过房间时,该房间号为下标对应的数组值即加10。最后找到最大的数组值,即为移动完桌子
需要的最短时间。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int t,n,count[410],i,start,end,k;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
memset(count,0,sizeof(count));
while(n--){
scanf("%d%d",&start,&end);
//可能出发位置比目的地房间大。
if(start>end){
//无论大小,我们都可以看做从小的房间移动到大的房间
k=start;
start=end;
end=k;
}
if(start%2==0)//考虑实际情况,出发房间为偶数是减一,可参照题中给出的图一
start-=1;
if(end%2==1)//目的地房间为奇数时加一
end+=1;
for(i=start;i<=end;++i)
count[i]+=10;
}
printf("%d\n",*max_element(count,count+400));//STL中寻找数列最大值函数
}
return 0;
}