P1672 题解

一题很简单的差分。

洛谷中题解
思路
显而易见,我们可以先算出每一天消耗的饲料数,再看从第 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");
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值