题目
有一位农场主约翰,他有一只饥饿的牛贝西。
每一天晚上,如果农场里有至少
1
1 堆干草,那么贝西吃且仅吃
1
1 堆干草。
有
�
n 个事件,第
�
i 个事件表示第
�
�
d
i
天早晨约翰搬运了
�
�
b
i
堆干草到农场。
求第
1
∼
�
1∼t 天贝西共吃掉干草堆的数量。
1
≤
�
≤
1
0
5
1≤n≤10
5
,
1
≤
�
≤
1
0
14
1≤t≤10
14
,
1
≤
�
�
≤
1
0
14
1≤d
i
≤10
14
,
1
≤
�
�
≤
1
0
9
1≤b
i
≤10
9
。
1
≤
�
1
<
�
2
<
⋯
<
�
�
≤
�
1≤d
1
<d
2
<⋯<d
n
≤t。
模拟做法
设
�
�
�
sum 为目前农场里剩余干草堆的数量,
�
�
�
ans 为目前贝西共吃掉干草堆的数量。
对于每个
�
i,我们不妨设
�
�
�
pos 为第
�
�
−
1
∼
�
�
−
1
d
i−1
∼d
i
−1 天贝西共吃掉干草堆的数量,则有
�
�
�
=
min
(
�
�
�
,
�
�
−
�
�
−
1
)
pos=min(sum,d
i
−d
i−1
),并执行
�
�
�
←
�
�
�
−
�
�
�
sum←sum−pos 与
�
�
�
←
�
�
�
+
�
�
�
ans←ans+pos,最后不能忘了执行
�
�
�
←
�
�
�
+
�
�
sum←sum+b
i
。
千万要注意,第
�
�
∼
�
d
n
∼t 天共吃掉干草堆的数量还没加上,所以最终要输出
�
�
�
+
min
(
�
�
�
,
�
−
�
�
+
1
)
ans+min(sum,t−d
n
+1),而不是直接输出
�
�
�
ans。
代码实现
#include<bits/stdc++.h>
using namespace std;
long long n,t,sum,ans,pos,d[100010],b[100010];
int main(){
scanf("%lld%lld",&n,&t);
for(long long i=1;i<=n;i++){
scanf("%lld%lld",&d[i],&b[i]);
pos=min(sum,d[i]-d[i-1]);
sum-=pos,ans+=pos,sum+=b[i];
}
printf("%lld",ans+min(sum,t-d[n]+1));
return 0;
}