解题思路:
刷题不够的童鞋看到这道题有思路,但是估计是暴力枚举了,可能超时哦,emmm(虽然我也是枚举的,但没那么暴力,也不会超时),对这道题,先想想,如果要能掉下去,那么下面的平台的高度一定低一点,所以我们可以先按高度排个序,但是光按高度排序是不行的,因为有高度相同的,那么此时就要看到题意里面,高度相同满足条件的话就掉到我们优先输入的平台上,那么排序条件就有两个,这个就是cmp1,接下来就用一个递归搜索就行了,这个应该没问题,然后完成之后,我们要再用sort排序回来,因为结果要按输入的顺序输出的,这就是cmp2,这道题我看了很多题解大多都是用了几个数组,我有点纳闷,为什么能够用结构体封装的数据很多人都喜欢用数组???是结构体有坏处吗?占空间?还是时间占了?用几个数组占的内存差不多但更麻烦,为什么不用结构体???
#include<iostream>
#include<algorithm>
using namespace std;
int n, flagz, flagy;
struct store
{
int num, xz, xy, h;
int zuo = 0, you = 0;
}ans[1005];
bool cmp1(store a, store b)
{
if (a.h == b.h) return a.num > b.num;
return a.h < b.h;
}
bool cmp2(store a, store b)
{
return a.num < b.num;
}
void fun(int i)
{
if (i == n + 1) return;
for (int o = i - 1; o > 0; --o) {
if (!flagz && ans[o].h < ans[i].h && ans[o].xz < ans[i].xz && ans[o].xy > ans[i].xz) ans[i].zuo = ans[o].num, flagz = 1;
if (!flagy && ans[o].h < ans[i].h && ans[o].xy > ans[i].xy && ans[o].xz < ans[i].xy) ans[i].you = ans[o].num, flagy = 1;
if (flagz && flagy) break;
}
flagz = flagy = 0;
fun(i + 1);
}
int main()
{
cin >> n;
int i;
for (i = 1; i <= n; ++i) {
cin >> ans[i].h >> ans[i].xz >> ans[i].xy;
ans[i].num = i;
}
sort(ans + 1, ans + n + 1, cmp1);
fun(1);
sort(ans + 1, ans + 1 + n, cmp2);
for (i = 1; i <= n; ++i) cout << ans[i].zuo << " " << ans[i].you << endl;
return 0;
}