夏季每日一题
一、饥饿的牛
由题意知,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、注意细节,别落下最后一个循环