夏季每日一题

夏季每日一题

一、饥饿的牛

原题链接

由题意知,N个d点,把【1,T】划分成 N+1 个区间,而区间和区间之间相似度很高,处理方法很像,所以我们想到用循环处理。

由题意分析,

1、一天吃一捆草

2、剩下的草会被后面的天吃(要记录草数据)

单独领出来一个区间

这个区间的特点:

1、草量只更新一遍,所以 小区间【 d i , d ( i + 1 ) - 1】,本区间刚开始的时候的草量 cur

2、在这段时间过去后,消耗的草量 days = mid(len,cur) // 取区间长度和刚开始草量的最小值

代码特点:

1、last = d-1 与区间左端有关,循环一次更新一次(即,移动到下一个区间),还可以计算长度

2、cur 计算方法 ,本区间刚开始的草量 = 上一个区间剩的(上一个区间刚开始的草量-消耗的) + 本区间刚开始给的 cur = cur-days +b

3、我们的循环是n次,但实际上有(n+1)个区间,所以记得处理最后一个区间

完整代码如下(有注释)

如果有错,请不要吝啬您的建议

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

long long n,t;//样例数,天数
long long d,b;//第d天,当天给的草捆数
long long cur;//每个区间一开始的草量
long long last;
//last=d-1 d从1开始 ,last从0开始
//last+1 (di)是区间左端,d(i+1)-1是区间右端  相当于每个区间在刚开始的时候更新一遍
//第一次更新是0
long long res;//记录结果
long long days;//记录一个区间里面有多少天是有草吃的
int main(){
    scanf("%ld%ld",&n,&t);
    while(n--){
        scanf("%ld%ld",&d,&b);
        long long len = (d-1)-(last+1)+1;//本区间长度
        //把本区间长度和本区间一开始的草量做对比
        days=min(len,cur);
        res+=days;
        cur=cur-days+b;//下一个区间刚开始的草量=本区间剩下的+更新的
        last=d-1;//更新区间左端点,相当于移动到下一个区间
        //此时的d相当于 di ,下一个循环输入的d相当于d(i+1)
    }
    //最后一个区间没有进入循环,所以要单独拿出来计算,cur已经更新,左端点已经更新,但是长度未更新
    //len=t-last;
    res+=min(cur,t-last);
    printf("%ld\n",res);
    return 0;
}

我的经验教训:

1、数学思维和编程思维不一样,有的数学思维很难体现在代码上,我们要学会运用代码循环的能力,找出循环体

2、未知数多,要给未知数标清楚意思

3、注意细节,别落下最后一个循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值