题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2245
|
||||||
| Description | ||||||
![]() 如图所示,Zoidtrip是一个休闲向小游戏…… |
||||||
| Input | ||||||
| 多组测试数据。 每组测试数据第一行为两个正整数 n和v。 接下来n行,每行3个整数l[i] , r[i] , d[i]。 ( N <= 2000000,0 <= 所有数据 < 2^31 ) |
||||||
| Output | ||||||
| 对于每组数据,输出一行,包含一个整数,代表最多前进至的层数。 | ||||||
| Sample Input | ||||||
| 3 7 1 3 1 4 10 5 8 10 1 4 1 1 1 1 2 5 10 1 1 1 3 5 2 |
||||||
| Sample Output | ||||||
| 2 4 |
||||||
| Hint | ||||||
|
“第i层障碍物与第i-1层障碍物之间的距离为d[i]” 样例1解释如下: 我们可以出生位置向右下移动至第一层坐标为1的地方。接下来可以继续一直向右下移动至第二层坐标为6的地方。 但无论如何也无法移动至第三层的8~10之间。
样例2说明如下: |
||||||
| Source | ||||||
| 哈尔滨理工大学第五届ACM程序设计竞赛 |
PS:
把 三角胞在每一层能走到的且满足能避开障碍物的最左和最右的距离找出来!
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define maxn 2000047
LL l[maxn], r[maxn], d[maxn];
int main()
{
LL n, v;
while(scanf("%lld%lld",&n,&v)!=EOF)
{
LL L = 0,R = 0;
int ans = 0;
for(int i=0; i<n; i++)
{
scanf("%lld%lld%lld",&l[i],&r[i],&d[i]);
}
for(int i = 0; i < n; i++)
{
if(l[i] > r[i])
{
LL t = r[i];
r[i] = l[i];
l[i] = t;
}
L-=d[i];
R+=d[i];
L = max(l[i],L);
R = min(r[i],R);
if(L > R)
{
break;
}
ans++;
}
if(v == 0)
ans = 0;
printf("%d\n",ans);
}
return 0;
}
原文:http://blog.csdn.net/u012860063/article/details/44784163