蓝桥大学的小 B 同学宿舍
贪心
小 B 的宿舍楼沿着走廊南北向的两边各有 200 个房间。
[房间1][房间3][房间5][房间7][房间9 ]...[房间399]
----------------------------------------------
走廊
----------------------------------------------
[房间2][房间4][房间6][房间8][房间10]...[房间400]
走廊狭窄,走廊里只能通过一个搬运的物品(可以同向也可以反向),因此必须指定高效的搬运计划。每位同学有10 分钟的时间搬运。
当房间 i 搬运行李到 j 时,i 与 j 之间的走廊都会被占用。所以,10 分钟之内同一段走廊最多
1个人同时搬运,不重叠的走廊也可以同时搬运。
小 B 的老师是个数学老师,经过运筹学一通计算他得到了最优的搬运计划。
虽然计划不唯一,但是最优值唯一,请问这个最短时间是多少?
不难发现,相对应的两个房间其实是占用一段走廊的,我们可以将将房间号映射为走廊号。
该题属于贪心算法,因为它尽可能使搬运办公桌同时进行,以便使单独安排的搬运次数最少。这样用的时间最少,即所用最少时间为不能同时搬运桌子的次数,即某一段走廊使用次数最多(贪心标准)即为最少搬运时间。
#include <cstdio>
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int move[200];
int T;cin>>T;//样例数量
while(T--){
int from, to;//每次搬运的起点和终点
int maxAns=0;
int N;cin>>N;//人的数量(搬运行为数量)
memset(move, 0, sizeof(move));
for(int i = 0; i < N; i++){
cin>>from>>to;
//将房间号映射为走廊号
from = (from - 1)/2;to = (to - 1)/2;
//确保from<to
if(from > to)swap(from, to)
//统计占用走廊情况,并统计最大值
for(int j = from; j <= to; j++){
move[j]++;//从from到to这段距离的走廊被占用,(走廊被占用通过给走廊编号,也就是房间号映射)
maxAns=max(maxAns,move[j]);//记录被占用最频繁的走廊(房间号)
}
}
cout<<maxAns*10<<endl;
}
}