题目描述:
东东要上学了!
东东要去他家路口的公交车站等车!!!
东东从家出发,需要 d 分钟到达公交站台。
已知有 n 班公交车,第 i 路公交车在 a_i 分钟到达公交站台,随后每 b_i 分钟会有该路公交车。
东东想着他要迟到了!!!可恶!!!要迟到了!!于是他看见了一辆公交车来了,立马跳上了这辆"他见到的"第一辆公交车。
东东上车后发现了一个问题!!这不是去幼儿园的车!!!!可惜车门已经焊死。
那么问题来了东东上的是第几路车?
Input
第一行输入路线数n和东东到达的时间d(1≤n≤100,1≤d≤1e5)
接下来n行,每行两个数字a_i和b_i(1≤a_i,b_i≤1e5),分别为该路公交首辆车到达的时间和两辆车之间的发车间隔
如果有多种可能,输出一种
Output
东东所上车的公交车的路线编号。
Examples
Input
2 2
6 4
9 5
Output
1
Input
5 5
3 3
2 5
5 6
4 9
6 1
Output
3
Input
3 7
2 2
2 3
2 4
Output
1
题目分析:
这个样例看的我一脸懵,我一开始没反应过来咋回事儿,结果发现是:我到了车站之后如果有车我就上,如果没有车我就等着,等到最早的车来到位置,当然题目里说了只需要一辆车就可以,不是全写出来。其实这个问题可以再简化一下,如果你到了车站马上有车那就意味着等待时间为0,这样就把问题合并起来了,所以我们要求的就是在刚刚超过或者等于到车站的时间时最小的那一个,这样到了之后就可以等最小的时间然后遇到最早来的车。
那么对于每一辆车来说就要求出刚刚超过(或者等于)到车站的时间的时间了,while里面刚好在退出的时候不满足要求,退出的时候是刚刚好大于等于到车站的时间,所以满足前面的分析。
while(t[i].arrive<d)
{
t[i].arrive=t[i].arrive+t[i].range;
}
然后就可以求出最小时间了,记录下最小时间的标号。
if(t[i].arrive<mintime)
{
num=i;
mintime=t[i].arrive;
}
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
struct time
{
int arrive;
int range;
}t[110];
int main()
{
memset(t,0,sizeof(t));
int n,d;
cin>>n>>d;
for(int i=1;i<=n;i++)
{
cin>>t[i].arrive>>t[i].range;
}
int num=0;
int mintime=1919810;
for(int i=1;i<=n;i++)
{
while(t[i].arrive<d)
{
t[i].arrive=t[i].arrive+t[i].range;
}
if(t[i].arrive<mintime)
{
num=i;
mintime=t[i].arrive;
}
}
cout<<num<<endl;
}