题意:走廊两边各有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;
}