P1779 跳板
小胡同学在出题的时候感到有点饿,于是决定出去找点吃的。
小胡同学住在一条长长的公路的一头。为了方便行动,小胡同学找小水同学沿路安装了一些跳板。每个跳板能够将胡同学发射到一定距离内的任意位置。
在公路的另一头,有小胡同学很喜欢吃的炸鸡店。小胡同学想请你帮忙计算,在充分利用跳板的情况下,他要走多远才能到达炸鸡店。
输入描述
第一行两个整数 NN 和 MM 表示跳板的个数和炸鸡店到小胡同学家的距离
后面 NN 行,第 ii 行包含两个整数 P_iPi 和 X_iXi 表示第 ii 个跳板安装在距离小胡同学家 P_iPi 处,它能够发射的距离为 X_iXi
数据保证:
-
N \le 10^5N≤105
-
N \le MN≤M
-
\forall i < j , P_i < P_j∀i<j,Pi<Pj
-
0 \le P_i \le M \le 10^90≤Pi≤M≤109
-
0 < X_i \le 10^90<Xi≤109
输出描述
一个整数,表示胡同学要步行的距离。
样例输入 - 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再加上多组输入就不超时了。也不知道为什么。