4908. 饥饿的牛

 

 

 使用数组的方法

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+10;
typedef long long ll;
// 1~T天中 有n天发草
// 发草日期存在d数组中 对应的草料数量存在b数组中
// 问发的草够吃几天
// 注意数据范围 直接开ll存储
// 以今天到的草 下一次发的时候吃的逻辑模拟
// 开三个变量 ans记录答案 t记录手上还剩多少草 last记录上次发草的时间
// d[i]天发草
// 若手上的草料足够撑到d[i]天 ans+=d[i]-last;
// 然后 last更新为d[i] t-=d[i]-last t+=b[i]
// 若不够
// ans+=min(t,T+1-last) 因为只计算到第T天 超了就不用计算了
ll n,T;
ll d[N],b[N];
int main (){
    cin>>n>>T;
    ll ans=0;//存储答案
    ll t=0;//今天还剩多少草
    ll last=0;//上次发草时间
    d[0]=0,b[0]=0;
    d[n+1]=T+1,b[n+1]=0;
    for (int i=0;i<=n+1;i++) {//今天到的草 下一次发的时候吃
        if (i>=1&&i<=n) scanf ("%lld %lld",&d[i],&b[i]);
        if (t>=d[i]-last){//攒下的草够吃到发草日
            t-=d[i]-last;
            ans+=d[i]-last;
            t+=b[i];
        }
        else {
            ans+=min(t,T+1-last);
            t=b[i];
        }
        last=d[i];
    }
    cout<<ans;
    return 0;
}

 不使用数组的方法

#include <iostream>
using namespace std;
// 这题不用开数组,注意范围记得long long
// 直接用i来记录上一次送草的日期
// di即当前送草日  bi即当前送草日送草捆数 
// s保存答案天数  g记录当前草总捆数

// 当我们收到草时,只有两种情况: 
// 1.在本次送草之前的某天,草已经吃光(即当前送草日di-上次送草日i >= 草捆数g) 
// 2.还没吃光 
int main(){
    long long n,t,di,bi,s=0,g=0,i=0;
    cin>>n>>t;
    while(n--){
        cin>>di>>bi;
        if(di-i>=g){// 草已吃光 
            s+=g;// 那么增加天数只能为之前草所够吃的天数g(即之前草的捆数)
            g=bi;// 因为之前草已经吃光,所以本次送草之后草数量更新为本次送草数bi 
        }
        else{// 没吃光 
            s+=di-i;// 增加天数为上次送草到本次送草这段时间内吃的草数 
            g-=di-i;// 更新草数量 
            g+=bi; // 加上本次送草数 
        }
        i=di; // 更新上次送草日 
    }
    if((t-i+1)<=g) s+=(t-i+1);// 还没到最后一天,加上剩下够吃的天数即可,注意不要超过t 
    else s+=g;
    cout<<s;
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值