题目描述
约翰想知道上一船饲料是什么时候运到的。在饲料运到之前,他的牛正好把仓库里原来的饲料全吃光了。他收到运来的 F1(1 ≤ F1 ≤ 10^6) 千克饲料。遗憾的是,他已经不记得这是哪一天的事情了。到第 D(1 ≤ D ≤ 2 × 10^3) 天为止,仓库里还剩下 F2(1 ≤ F2 ≤ F1)千克饲料。
约翰养了 C(1 ≤ C ≤ 100) 头牛,每头牛每天都吃掉恰好 1 千克饲料。由于不同的原因,牛们从某一天开始在仓库吃饲料,又在某一天离开仓库,所以不同的两天可能会有差距很大的饲料消耗量。每头牛在来的那天和离开的那天都在仓库吃饲料。给出今天的日期 D,写一个程序,判断饲料最近一次运到是在什么时候。今天牛们已经吃过饲料了,并且饲料运到的那天牛们还没有吃过饲料。
输入格式
第 1 行:四个整数 C,F1,F2,D,用空格隔开。
第 2 到 C+1 行:每行是用空格隔开的两个数字,分别表示一头牛来仓库吃饲料的时间和离开的时间。
输出格式
一个正整数,即上一船饲料运到的时间。
输入输出样例
输入
3 14 4 10 1 9 5 8 8 12
输出
6
说明/提示
样例解释
上一次运来了 14 千克饲料,现在饲料还剩下 4 千克。最近 10 天里,有 3 头牛来吃过饲料。
约翰在第 6 天收到 14 千克饲料,当天吃掉 2 千克,第 7 天吃掉 2 千克,第 8 天吃掉 3 千克,第 9 天吃掉 2 千克,第 10 天吃掉 1 千克,正好还剩 4 千克。
数据规模
1 ≤ F2 ≤ F1 ≤ 10^6,1 ≤ D ≤ 2×10^3,1 ≤ C ≤ 100。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1000001; // 内存要开的足够大
int a[N], diff[N];
int i;
int main(){
int C, F1, F2, D;
cin >> C >> F1 >> F2 >> D;
// 使用分差的方法给区间增加数据
for (i = 1; i <= C; i++){
int s, e;
cin >> s >> e;
diff[s] += 1;
diff[e + 1] -= 1;
}
// 完成处理后的数据进行还原
for (i = 1; i < N; i++) a[i] = diff[i] + a[i - 1];
// 从当前日期往前计算,找到吃掉的加剩余的量为运输来的量时,则是收货日期
for (i = D; F2 != F1; i--) F2 += a[i];
cout << i + 1;
return 0;
}