这道题思路还是很简单的:因为要求至少要用多少时间,那么就要求出哪个子走廊要用到的次数最多,重叠次数最多的即所求答案,于是用一个计数器数组flag[]记录经过过房间的次数,最后flag中的最大值既结果。
但是需要注意的有两点,
1.如果开始的房间数是偶数,则要将区间起点-1,如果结束的房间号是奇数,则要将区间终点+1.
2.不一定是从小房间号搬到大房间号,也可能从大房间号搬到小房间号,所以在输入搬桌子的起点终点后,要把小的房间号存在扫描区间起点start中,把大的房间号存在end中。(因为没考虑到这点,贡献了一次wa,又因为交换函数写错地方了,要贡献了一次wa,伤心。。)
代码如下
#include "iostream"
using namespace std;
#define len 410
int main()
{
int t;
int n;
int i;
scanf("%d",&t);
int flag[len];
int ans;
while (t--)
{
int start,end;
scanf("%d",&n);
memset(flag,0,sizeof(flag));
ans=0;
while(n--)
{
scanf("%d",&start);
scanf("%d",&end);
if (start>end)
{
int t;
t=start;
start=end;
end=t;
}
if (start%2==0)
i=start-1;
else
i=start;
int iend;
if (end%2==1)
iend=end+1;
else
iend=end;
for (;i<=iend;i++)
{
flag[i]++;
if(flag[i]>ans)
ans=flag[i];
}
}
printf("%d\n",ans*10);
}
return 0;
}