题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1050
没有交叉的区间是可以同时进行的。那么需要的次数便是某个点所经过的最大次数。
两个含有相同占用走廊段的移动无法同时进行 故移动次数取决于被占用次数最多的那段走廊 并与之相等。
第一.首先要注意,对门的两个房间不能同时移桌子。我们读入房间号时,要对房间号做处理(比如令房间号=(房间号+1)/2),使得对门的两个房间的编号相同,方便处理。
解法一的思想是,将一次从from->to的移动看成一个线段,n次移动可以看成n条线段。将这n条线段画在数轴上,则最少需要移动的次数,等于线段重叠(两条线段至少包含相同的一点算作重合)的最大层数。这种解法似乎没有包含典型的贪心思想,至少我的愚见是这样。这种解法可以用数学归纳法证明。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int t,n,x,y,a[205];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
memset(a,0,sizeof(a));
while(n--){
scanf("%d%d",&x,&y);
if(x>y)
swap(x,y);
for(int i=(x+1)/2;i<=(y+1)/2;i++)
a[i]++;
}
int ans=0;
for(int i=1;i<=200;i++)
ans=max(ans,a[i]);
printf("%d\n",ans*10);
}
}