题目链接
题目详情
贝茜是一头饥饿的牛。 每天晚上,如果牛棚中还有干草的话,贝茜都会吃掉其中的一捆。 初始时,牛棚中没有干草。 为了让贝茜不被饿死,农夫约翰制定了 N 个给贝茜送干草的计划。 其中第 i 个计划是在第 di 天的白天给贝茜送去 bi 捆干草。 这些计划互不冲突,保证 1≤d1<d2<…<dN≤T
请你计算,贝茜在第 1∼T 天中有多少天有干草吃。
输入格式
第一行包含两个整数 N 和 T。 接下来 N行,每行包含两个整数 di,bi。
输出格式
输出贝茜在第 1∼T1∼T 天中有干草吃的天数。
数据范围
输入样例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;
}