P1105 平台

发布时间 2023-09-26 16:55:59作者: 不o凡

贪心枚举,高度高的排在前面,相同高度序号小的排在前面
分别遍历左右端点,如果符合条件直接退出,注意俩端点重叠不算
在分别用L,R数组记录下标,方便输出

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
struct node {
	int h, l, r,id;
}a[N];
bool cmp1(node x, node y) {
	if (x.h != y.h) return x.h > y.h;
	return x.id < y.id;
}
int L[N], R[N];
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i].h >> a[i].l >> a[i].r;
		a[i].id = i;
	}
	sort(a + 1, a + 1 + n, cmp1);
	for (int i = 1; i <= n; i++) {
		for (int j = i+1; j <= n; j++) {
			if (a[j].h < a[i].h && a[j].l < a[i].l && a[j].r > a[i].l) {
				L[a[i].id] = a[j].id;
				break;
			}
		}
		for (int j = i+1; j <= n; j++) {
			if (a[j].h < a[i].h && a[j].l < a[i].r && a[j].r > a[i].r) {
				R[a[i].id] = a[j].id;
				break;
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		cout << L[i] << ' '<<R[i] << '\n';
	}
	return 0;
}