题意:走廊两边各有200个屋子,房间号如题目所示,有桌子需要从一个屋子运送到另一个屋子,因为走廊太窄,每次只能送一个桌子且不管距离长短都花费10分钟,在这十分钟内,不能有其他运送桌子的经过这节走廊,除非运送路线中没有其他运送桌子的出现,问n个运送桌子的最少需要多长时间运送完毕。
题解:有两个坑点,一个是两个连续奇数和偶数的是面对面,所以先统一化成奇数或偶数,避免 1 3、4 6花费10分钟这种错误出现,另一个坑点是起点和终点可能大小不统一,排序判断会有影响,输入是规定小值都是起点,大值都是终点。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 205;
struct P {
int s, t;
}p[N];
int vis[N];
int cmp(P a, P b) {
if (a.s != b.s)
return a.s < b.s;
return a.t < b.t;
}
int main() {
int cases, n, a, b, num;
scanf("%d", &cases);
while (cases--) {
memset(vis, 0, sizeof(vis));
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &a, &b);
if (a < b) {
p[i].s = a % 2 ? a : a - 1;
p[i].t = b % 2 ? b : b - 1;
}
else {
p[i].t = a % 2 ? a : a - 1;
p[i].s = b % 2 ? b : b - 1;
}
}
sort(p, p + n, cmp);
int ans = 0;
for (int i = 0; i < n; i++) {
if (!vis[i]) {
vis[i] = 1;
int flag = i;
for (int j = i + 1; j < n; j++)
if (!vis[j] && p[j].s > p[flag].t) {
vis[j] = 1;
flag = j;
}
ans += 10;
}
}
printf("%d\n", ans);
}
return 0;
}