著名的ACM公司租了一栋建筑的一楼用来办公,楼层形状如下。
Room 1 | Room 3 | Room 5 | 。。。 | Room 397 | Room 399 |
| |||||
Room 2 | Room 4 | Room 6 | 。。。 | Room 398 | Room 400 |
这层楼南北各200间房分布在走廊的两侧,最近这个公司想要改革制度,这项改革包括在房间之间移动很多桌子。因为走廊很窄桌子很大,所以某一时刻只有一张桌子能通过走廊。需要算法使桌子在房间之间高效地移动,经理想出了以下方案:移动一张桌子从一个房间到另一个房间至少需要10分钟,当从房间i向房间j移动桌子时,房间i到房间j之间的走廊就被占用了。所以,在10分钟之内,两房间之间的任何桌子移动都是不被允许的,为了使问题明确,经理举例说明了同时移动的可能情形和不可能情况。
| Table moving | 原因 |
可能情况 | 房间30到50和房间60到90 | 没有共享走廊 |
房间11到12和房间14到13 | 没有共享走廊 | |
不可能情况 | 房间20到40和房间31到80 | 房间31到40前面的走廊被共享 |
房间1到4和房间3到6 | 房间3到4前面的走廊被共享 | |
房间2到8和房间7到10 | 房间7到8前面的走廊被共享 |
对于每个房间,最多有一张桌子被移入或移出。现在经理寻要找到了一种方法在最短的时间内移动所有的桌子,你的任务是写一个算法去解决经理的问题。
输入:
输入包含T组测试数据,T在输入的第一行被给出。每一组测试数据以一行正整数N开始,1<=N<=200,N代表移动桌子的数目,每一个N后面跟着两个位置整数s和t,代表桌子从房间s移动到房间t(在一个N后面每一个房间的号码最多出现一次),从第N+3行开始剩余的测试案例用像上面同样的方式列出即可。
输出:
输出应包含使移动桌子任务完成的最小时间,每个一行。
样例输入:
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.写一个struct类型的数据结构
2写cmp函数
3while输入
4排序函数
5for循环判断相容性
6输出
经过分析后,此题与活动安排问题相似。此题的房间i和房间j,相当于活动安排问题的起始时间s和结束时间f,两者的区别是对两段重叠后的处理,前者对于重叠的是保留且计数,后者只对不重叠的部分保留。
觉得这样的题都可以转换成带有开始和结束的段。