总结一下:此题要求我们看看从平台左右边落下之后会落在哪一个平台上,我刚刚开始编的无法解决上下平台相邻,题目要求输出的是0,而我输出的是低高度平台的值,所以后来着手解决这一问题
解决问题:刚开始我想的是排除掉边在俩个边缘的情况,然后判断下面平台是否是连续的但要判断的条件太多了,因为本身我的想法就存在非常严重的缺陷,这是想到了我们可不可以从上至下搜索满足条件的平台,而且呢题目要求重叠的平台我们选择序号偏小的品台,所以我们优先以高度大为优先级大,次级就按序号小排,然后从上至下来搜索。
#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct Flat {
int right;
int left;
int number;
int hign;
};
bool cmp(Flat a, Flat b)
{
if (a.hign != b.hign)
{
return a.hign > b.hign;
}
else
{
return a.number < b.number;
}
}
int main()
{
Flat flat[1000 + 10];
int rcondition[1000+10];
int lcondition[1000 + 10];
int n;
cin >> n;
for (int i = 1;i <= n;i++)
{
flat[i].number = i;
int hign, right, left;
cin >> hign >> left >> right;
flat[i].hign = hign;
flat[i].left = left;
flat[i].right = right;
}
sort(flat + 1, flat + n + 1, cmp);
memset(rcondition, 0, sizeof(rcondition));
memset(lcondition, 0, sizeof(lcondition));
for (int i = 1;i <= n;i++)
{
for (int j = i + 1;j <= n;j++)
{
if (flat[j].left<flat[i].left&&flat[j].right>flat[i].left)
{
lcondition[flat[i].number] = flat[j].number;//搜索左边是否能承接上上一个平台落下来的
break;
}
}
for (int j = i + 1;j <= n;j++)
{
if (flat[j].left<flat[i].right&&flat[j].right>flat[i].right)
{
rcondition[flat[i].number] = flat[j].number;//搜索右边是否能承接上上一个平台落下来的
break;
}
}
}
/*bool lflag = false, rflag = false;
if (flat[i].left == 0) {
printf("0 ");lflag = true;
}
if (!lflag)
{
if (condition[flat[i].left] == condition[flat[i].left - 1])
{
printf("%d ", condition[flat[i].left]);
}
else
{
cout << "0 ";
}
}
if (flat[i].right == n) {
printf("0\n");rflag = true;
}
if (!rflag)
{
if (condition[flat[i].right] == condition[flat[i].left + 1])
{
printf("%d\n", condition[flat[i].right]);
}
else
{
cout << "0\n";
}
}
for (int j = flat[i].left;j <= flat[i].right;j++)
{
condition[j] = flat[i].number;
}*/
for (int i = 1;i <= n;i++)
{
cout << lcondition[i] << " " << rcondition[i];
if (i != n)
{
cout << endl;
}
}
}