4908. 饥饿的牛

92 阅读1分钟

题目链接

题目详情

贝茜是一头饥饿的牛。 每天晚上,如果牛棚中还有干草的话,贝茜都会吃掉其中的一捆。 初始时,牛棚中没有干草。 为了让贝茜不被饿死,农夫约翰制定了 N 个给贝茜送干草的计划。 其中第 i 个计划是在第 di 天的白天给贝茜送去 bi 捆干草。 这些计划互不冲突,保证 1≤d1<d2<…<dN≤T

请你计算,贝茜在第 1∼T 天中有多少天有干草吃。

输入格式

第一行包含两个整数 N 和 T。 接下来 N行,每行包含两个整数 di,bi。

输出格式

输出贝茜在第 1∼T1∼T 天中有干草吃的天数。

数据范围

1N105,1≤N≤10^5,
1T1014,1≤T≤10^{14},
1di1014,1≤di≤10^{14},
1bi1091≤bi≤10^9。

输入样例1:

1 5
1 2

输出样例1:

2

输入样例2:

2 5
1 2
5 10

输出样例2:

3

解题思路

首先看一下没过的代码,最简单的方法就是统计一下每天是否有草吃,有的话a[i]=1;然后统计1~t有草吃的天数,并输出。因为数据范围的原因,会爆掉!!!

signed main()
{

int n,t;
cin>>n>>t;
memset(a,0,sizeof a);
while(n--)
{
        int d,b;
        cin>>d>>b;
        for(int i=d;i<d+b;i++)
        {
            a[i]=1;
        }
    }
    int cnt=0;
    for(int i=1;i<=t;i++)
    {
        if(a[i]==1)    cnt++;
    }
    cout<<cnt;
    return 0;

}

那么我们换一种思路:
用i来记录上一次送草的日期 sum保存答案天数 now记录当前草总捆数 当我们收到草时,只有两种情况:一种是没吃光,另一种是在本次送草之前,草已经吃光。

AC代码

#include <iostream>
using namespace std;

int main(){
long long n,t,d,b;
long long sum=0,now=0,i=0;
cin>>n>>t;
while(n--){
cin>>d>>b;
if(d-i>=now){
    sum+=now;
    now=b;
}
else{
sum+=d-i;
now-=d-i;
now+=b;
}
i=d; 
}
if((t-i+1)<=now) sum+=(t-i+1);
else sum+=now;
cout<<sum;
return 0;
}