原题大意:在一个走廊两边都有对称分布的连续房间,现在有n张桌子需要从a移动到b房间。每次移动需要10分钟,但是如果两次移动中需要经过相同的走廊位置,则不能同时进行,需要分开移动。最后求最少需要多长时间移动完所有的桌子。
解题思路: 这还是一道贪心算法题目。这种题目解题很有技巧和公式。先画图分析下就知道了。
正如画图分析所知,只要求出n次移动过程当中每个走廊经过的次数,取最大值就是题解了。其实也就是n次移动过程中,最多会有多少次交叉。
代码编写: 其实,一开始没有想这样分析,第一反应是想直接采用模拟搬动过程: 每一轮循环中,找到不会交叉搬运的桌子。去掉。继续下一轮。这种方法也对。但是时间复杂度貌似会达到n^3。。基本就是超时的样子,所以没去写了。后来画图分析了下。发现挺简单的。最后放下AC代码吧。
#include <iostream>
using namespace std;
const int MAXN = 202;
int count1[MAXN];
int main() {
int t;
cin>>t;
while (t--) {
int n;
cin>>n;
for (int i =0; i<MAXN; ++i)
count1[i] = 0;
for (int i =0; i<n; ++i) {
int from, to;
cin>>from>>to;
if (to<from) {
int tmp = to; to = from; from = tmp;
}
for (int j=(from+1)/2; j<=(to+1)/2; j++) {
count1[j]++;
}
}
int max = count1[0];
for (int i =1; i<MAXN; ++i)
if (count1[i]>max)
max = count1[i];
cout<<max*10<<endl;
}
return 0;
}