题目:
魂斗罗喜欢到处跳平台玩。
空间中有一些平台。给出每个平台的位置,请你计算从每一个平台的边缘落下之后会落到哪一个平台上。
注意,如果某两个平台的某个两边缘横坐标相同,物体从上面那个平台落下之后将不会落在下面那个平台上(即平台的范围是一个开区间,不包含端点)。平台可能会重叠。
从平台下落时视作从平台下方开始下落,也就是说不会落到高度相同的平台上。如果有两个平台的高度相同且都可以被落到的话,那么会落到编号靠前的那个平台。
第一行有一个数 N 表示平台的个数;
接下来 N 行每行三个整数 分别是平台的高度 H i ,左端点的 X坐标 L i ,右端点的 X 坐标 R i 。
其中, 1 ≤ N ≤ 1000
0 ≤ H , L , R ≤ 2 × 10000
输出共 N 行,每行两个数,分别表示:
从第 i 个平台的左边缘落下后到达的平台序号和右边缘落下以后到达的平台序号。
输入数据中第一个平台的序号是 1。如果某个平台的某个边缘下面没有平台了,输出 0。
5
2 0 2
4 1 3
3 1 3
5 3 4
1 1 5
0 5
1 5
1 5
5 5
0 0
我的30pts代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
struct node
{
int high;
int left;
int right;
}v[N];
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d%d",&v[i].high,&v[i].left,&v[i].right);
for(int i=1;i<=n;i++)
{
int ml=0,mr=0;
for(int j=1;j<=n;j++)
{
if(v[i].high>v[j].high&&v[i].left<v[j].right&&v[i].left>v[j].left)
{
ml=j;
break;
}
}
for(int j=1;j<=n;j++)
{
if(v[i].high>v[j].high&&v[i].right<v[j].right&&v[i].right>v[j].left)
{
mr=j;
break;
}
}
printf("%d %d\n",ml,mr);
}
return 0;
}