1 题意
过道上有400个房间,分布如下:
现在有一些房间要将桌子搬到其他房间(搬运时间都是一样的),但是过道只放得下一个桌子。
为了让搬运时间最少,需要并发地搬运桌子,并且不发生冲突。
问:最短用时是多少?
链接:link。
2 思路
将过道从左至右编号,某个房子
x
x
x所在的过道编号用如下方式计算:
如果
x
x
x是奇数,则过道编号为
(
x
+
1
)
/
2
(x+1)/2
(x+1)/2。如果
x
x
x是偶数,则过道编号为
x
/
2
x/2
x/2。
命题:统计每个过道被经过的次数,最多的经过次数即为至少移动的次数。
证明:略。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=2e2+10;
int cnt[N];
int main(){
int T;scanf("%d",&T);
while(T--){
int n;scanf("%d",&n);
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++){
int x,y;scanf("%d %d",&x,&y);
x=x&1?(x+1)>>1:x>>1;
y=y&1?(y+1)>>1:y>>1;
if(x>y) swap(x,y);
for(int i=x;i<=y;i++) cnt[i]++;
}
printf("%d\n",*max_element(cnt,cnt+N)*10);
}
return 0;
}