蓝桥杯(小B的宿舍)

题目描述

小B的宿舍楼沿着走廊南北向的两边各有 200200 个房间,如下所示:

[房间1][房间3][房间5][房间7][房间9 ]...[房间399]
----------------------------------------------
                   走廊
----------------------------------------------
[房间2][房间4][房间6][房间8][房间10]...[房间400]

最近,由于转专业和专业分流的原因,宿舍将迎来新的调整,以便组成新的班级后方便管理。

但是由于走廊狭窄,走廊里只能通过一个搬运的物品(可以同向也可以反向),因此必须指定高效的搬运计划。

老师给了每位同学下达了以下要求,让同学们体现收拾好行李,然后给每位同学 1010 分钟的时间搬运。

当从房间 ii 搬运行李到 jj 时,ii 与 jj 之间的走廊都会被占用。所以,1010 分钟之内同一段走廊最多 11 个人同时搬运,不重叠的走廊也可以同时搬运。

小B的老师是个数学老师,经过运筹学一通计算他得到了最优的搬运计划。

虽然计划不唯一,但是最优值唯一,请问这个最短时间是多少?

输入描述

输入数据有 TT 组测试例,在第一行给出测试例个数 TT。

每个测试例的第一行是一个整数 NN(1≤N≤2001≤N≤200),表示要搬运行李的人数。

接下来 NN 行,每行两个正整数 ss 和 tt,表示一个人,要将行李是从房间 ss 移到到房间 tt。

输出描述

每组输入都有一行输出数据,为一整数 TimeTime,表示完成任务所花费的最小时间。

示例

输入

3
4
10 20
30 40
50 60
70 80
2
1 3
2 200
3
10 100
20 80
30 50

输出

10
20
30

 来自我这傻不愣登的解题过程

  1. 想象走廊是一条路,每人搬东西占一段路,占用的路段不能同时用。得数一数哪段路最频繁使用,排几个人就得等几轮想象走廊是一条路,每人搬东西占一段路,占用的路段不能同时用。一开始我只考虑了“挨着的两个人会不会撞”,只简单的对房间号做了一下排序,所以答案不对。
  2. 注意起点 s 和终点 t 得大小顺序不是固定的,一开始我也没考虑到这个,所以当t>s时,走廊段覆盖不成功。
  3. 根据房间南北走向得知,一侧是奇数号房间一边是偶数号房间,每两个房间(奇偶一对)共享一段路,所以还需将它们的房间号映射成过道号,然后根据过道的占用情况对它们进行累加覆盖。一开始我也没考虑到这个,只单纯的覆盖了每个房间号room,这种方法必然是AC不了的,因为它不是单侧的连续房间号。
  4. 最后,总时间=使用最频繁的那个过道的使用次数 max_cover * 10啦。

 代码如下:

#include
using namespace std;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		cin>>n;
		
		int s[205],t[205];
		//输入任务 
		for(int i=0;i>s[i]>>t[i];
		
		int cover[410]={0};	//用数组记录 "每段走廊" 被覆盖的次数
		int max_cover=0;//记录最大覆盖次数 
		
		for(int i=0;imax_cover)
					max_cover=cover[j];//更新最大覆盖次数 
			}
		}
		
		//总时间=最大覆盖次数 * 10 
		cout<<10*max_cover<

 希望能帮助到各位同志,若有疑问之处,或着各位有更好的解题方法,大家评论区留言,俺灰常灰常灰常乐意学习,咱们一起进步!蓝桥杯(小B的宿舍)_第1张图片

 

你可能感兴趣的:(算法)