1343: 看医生
时间限制: 2 Sec 内存限制: 256 MB
题目描述
小A得了一个很严重得病。他要拜访n个医生,以得到准确的诊断结果。每个医生都需要了解之前所有的病情信息,所以小A需要按照顺序拜访他们(从编号1依次到编号n)。
每个医生都有自己的工作时间。第i个医生第si天工作,并且每di 天工作一天,即第i个医生工作的时间为 si , si + di , si + 2di , ....
因为诊断时间很长,所以小A一天最多拜访一个医生。
请你帮小A计算他拜访完所有医生最少需要到第几天(是从第一天开始计算,而不是从拜访第一个医生开始)。
输入
第一行:一个整数T,测试实例个数
对于每组测试实例:
第一行:一个整数n (1 ≤ n ≤ 1000) —— 表示小A要拜访的医生的数量。
接下来的n行:每行包括两个整数 si 和 di (1 ≤ si, di≤ 1000) ,含义见上面题目描述。
输出
每组测试实例输出一行:包括一个整数——小A拜访完所有医生最少需要到第几天。
样例输入
2 3 2 2 1 2 2 2 2 10 1 6 5
样例输出
4 11
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int fif[] = new int[n];
for (int i = 0; i < n; i++) {
int nn = sc.nextInt();
int a[][] = new int[nn][2];
for (int j = 0; j < nn; j++) {
a[j][0] = sc.nextInt();
a[j][1] = sc.nextInt();
}
fif[i] = f(a);
}
for (int i = 0; i < fif.length; i++) {
System.out.println(fif[i]);
}
}
private static int f(int[][] a) {
int temp = a[0][0];
if(a.length==1) {
return temp;
}else {
for (int j = 1; j < a.length; j++) {
temp = ff(temp,a,j);
}
return temp;
}
}
private static int ff(int temp, int[][] a, int i) {
for (int j = 1; j < 10000 ; j++) {
if(a[i][0]>temp) {
return a[i][0];
}else {
int e = (temp+j-a[i][0])%a[i][1];
if(e==0) {
temp += j;
break;
}
}
}
return temp;
}
}
/**************************************************************
Problem: 1343
User: 20161514325
Language: Java
Result: 正确
Time:1100 ms
Memory:65912 kb
****************************************************************/