洛谷:P1672 [USACO05FEB] Feed Accounting S

题目描述

约翰想知道上一船饲料是什么时候运到的。在饲料运到之前,他的牛正好把仓库里原来的饲料全吃光了。他收到运来的 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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌新在此~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值