使用数组的方法
#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; }