【问题描述】
这几天同学们总是对阿迪议论纷纷,这使得他很烦恼,似乎产生了一些抑郁,头也有点痛,打不起精神,他只好去看医生。然而,他只有去看过 n 个医生之后才能确诊病情,每个医生都需要上一个医生的诊断结果,因此他必须按顺序去预约每个医生,也就是说,他必须先去看医生1,然后再去看医生2,然后是医生3,等等。只有到最后一个医生那里才能确诊,且每天只能看一个医生。
从今天开始,每个医生都有一个固定的出诊安排表,医生 i 在第 si 天看病人,然后在之后的每个第 di 天看诊。因此,他只在 si、si+di、si+2di、... 这些天工作。
预约每个医生有些困难,他想知道看完所有医生至少需要多少天?
【输入形式】
输入的第一行一个正整数 n ,表示医生的数量。
接下来的 n 行,每行两个正整数 si 和 di,表示第 i 个医生的工作情况。
【输出形式】
输出一行一个整数,表示阿迪看完最后一个医生的天数。
【样例输入】
3
2 2
1 2
2 2
【样例输出】
4
【样例说明】
第1位医生从第2天开始看病,然后在第4、6、8…天看诊
第2位医生从第1天开始看病,然后在第3、5、7…天看诊
第3位医生从第2天开始看病,然后在第4、6、8…天看诊
因此,阿迪可以在第2天去看第1位医生,然后在第3天去看第2位医生,第4天看第3位医生。
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n][2]; //定义二维数组a存储每位医生的si和di
for(int x=0;x<n;x++) //输入数据
{
for(int y=0;y<2;y++)
{
cin>>a[x][y];
}
}
int time=a[0][0]; //定义看完全部医生的总天数time,赋第一个医生的天数值
for(int i=1;i<n;i++) //循环进行每个医生的看的情况判断
{
int t=1,ti=0; //定义间隔次数t,进行过程中的医生看病天数ti
if(a[i][0]>time) time=a[i][0];
//当后续的医生开始看病的时间比看到前一个医生的总天数大时,直接赋值
else //当后续的医生开始看病的时间比看到前一个医生的总天数少时
{
while(1) //永真循环
{
ti=a[i][0]+t*a[i][1]; //用ti记录医生看病天数
if(ti>time) //ti比看到前一个医生的总天数大时
{
time=ti; //赋值
break; //跳出循环
}
else t++; //否则,间隔加一,继续循环
}
}
}
cout<<time;
return 0;
}