第八次模拟测试-6

东东在赶往学校的过程中面临一个有趣的挑战:选择哪辆公交车才能避免迟到。此问题涉及时间管理和路线规划,东东的目标是在到达公交站后立即上车,尽管可能上错车,但他必须找到最快的一辆。通过分析各路公交车的首班车时间和发车间隔,我们提供了一个算法解决方案,帮助东东做出最优选择。
摘要由CSDN通过智能技术生成

题目描述:
东东要上学了!

东东要去他家路口的公交车站等车!!!

东东从家出发,需要 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值