一题很简单的差分。
洛谷中题解
思路
显而易见,我们可以先算出每一天消耗的饲料数,再看从第 i 天到第 d 消耗的饲料数是否等于 f1 - f2。如果是,输出 i。
因为需要区间修改,可以使用差分,差分可以在极短的时间内完成区间修改。具体方法是记录每个数与前一个数的差值,对于在 l 到 r 的区间内加上 1,显然第 l 个数与第 l - 1 个数的差值会增加 1,第 r 个数与第 r + 1 个数的差值会减 1,最后还原数组即可。
代码
AC 记录
#include<bits/stdc++.h>
using namespace std;
int c,f1,f2,d,from[2005],t[2005],siliao[2005];
signed main() {
scanf("%d %d %d %d",&c,&f1,&f2,&d);
for(int i = 1;i <= c;i++) {
scanf("%d %d",&from[i],&t[i]);
//if(t[i] > d) t[i] = d;
siliao[from[i]]++,siliao[t[i] + 1]--;
}
for(int i = 1;i <= d;i++) siliao[i] += siliao[i - 1];
siliao[d] += f2;
int ans = 0;
//for(int i = 1;i <= d;i++) printf("%d ",siliao[i]);
//printf("\n");
for(int i = d;i >= 1;i--) {
ans += siliao[i];
if(f1 == ans){
printf("%d\n",i);
return 0;
}
}
printf("-1\n");
}