题目描述
N个X升容器分层叠放(即放N层),从上到下,编号分别从为从1到N。如果某个容器里装的水超过X升,则会溢出流到下层容器。
已知N个容器中已经分别装有若干升水,从最下层开始往上,每层导入若干升水,最终有多少升水会溢出到所有容器之外?
已知N<=10000,X<=1000。每个容器中倒入的水不超过10000升。
输入描述
第一行:两个数字N X
第二行开始共N行,每行两个数字。分别为容器I中原有多少升水,以及往容器I中倒入了多少升水。第n行数据对应的容器编号为n-1。
输出描述
溢出了多少升水。
示例
输入:
10 10
0 9962
1 2642
7 8773
9 523
6 3882
7 1093
0 3933
7 2276
6 4792
6 8904
输出:
46729
实现代码
import java.util.Scanner;
public class Test01 {
public static void main(String[] args){
//1. 接收数据n, x
int n, x;
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
x = scan.nextInt();
//2.定义一些数据
int out = 0; //总共溢出的水
int down_empty = 0; //下层总共可容纳多少升水
//3. 接收每一层数据
int[] arr = new int[10000];
for(int i=0; i<n; i++){
int have = scan.nextInt();
int put = scan.nextInt();
arr[i] = have + put;
}
/*
for(int i=0; i<n; i++){
System.out.println(arr[i]);
}
*/
//4.从第N层(最底层)模拟倒水操作
for(int i=n-1; i>=0; i--){
//到入水后不会溢出,即 arr[i] <= x+down_empty, 则更新down_empty
if(arr[i] <= (x + down_empty)){
down_empty += (x-arr[i]);
}else{
out += arr[i] - (x+down_empty);
down_empty = 0;
}
}
//5. 输出结果
System.out.println(out);
}
}