P1779 跳板

小胡同学在出题的时候感到有点饿,于是决定出去找点吃的。

小胡同学住在一条长长的公路的一头。为了方便行动,小胡同学找小水同学沿路安装了一些跳板。每个跳板能够将胡同学发射到一定距离内的任意位置。

在公路的另一头,有小胡同学很喜欢吃的炸鸡店。小胡同学想请你帮忙计算,在充分利用跳板的情况下,他要走多远才能到达炸鸡店。

输入描述

第一行两个整数 NN 和 MM 表示跳板的个数和炸鸡店到小胡同学家的距离

后面 NN 行,第 ii 行包含两个整数 P_iPi 和 X_iXi 表示第 ii 个跳板安装在距离小胡同学家 P_iPi 处,它能够发射的距离为 X_iXi

数据保证:

  • N \le 10^5N105

  • N \le MNM

  • \forall i < j , P_i < P_ji<j,Pi<Pj

  • 0 \le P_i \le M \le 10^90PiM109

  • 0 < X_i \le 10^90<Xi109

输出描述

一个整数,表示胡同学要步行的距离。

样例输入 - 1

Copy to Clipboard
3 9
0 3
2 3
3 6

样例输出 - 1

Copy to Clipboard
0

样例输入 - 2

Copy to Clipboard
10 10
0 1
1 1
2 1
3 1
5 1
6 1
7 1
8 1
9 1
10 1

样例输出 - 2

Copy to Clipboard
1
 

#include<iostream>
using namespace std;
int main(){
int N,M;
while(cin>>N){
cin>>M;
int p[N],x[N];
for(int i=1;i<=N;i++)
cin>>p[i]>>x[i];
int tag=1,walk=0,i;
if(p[1]>0)
{
walk=p[1];
}
for( i=2;i<=N;i++){
if(p[tag]+x[tag]>=M)
{
cout<<walk<<endl;
break;
}
if(p[tag]+x[tag]<p[i])
{
walk+=p[i]-p[tag]-x[tag];
tag=i;
}
else if(p[tag]+x[tag]>=p[i]&&(p[tag]+x[tag]<=p[i]+x[i]))
{
tag=i;
}
}
//cout<<i;
if(i==N+1&&x[tag]+p[tag]<M){
walk+=M-x[tag]-p[tag];
}
if(i==N+1)
cout<<walk<<endl;}
return 0;
}

之前数组开的[10001]一直不过,改成N再加上多组输入就不超时了。也不知道为什么。

posted @ 2022-06-08 09:08  辛夸高岭桂  阅读(128)  评论(0)    收藏  举报