Present

Present

https://ac.nowcoder.com/acm/problem/110615

  • 前言

    刚开始什么思路都没有,但是突然想到了一道题——换教室,似乎也是二分,然后运用到这一道题,似乎就明了了

  • 分析

    这道题的话,通过二分最小的w,是每一盆花的a[i]>=w,并且浇的天数小于等于m。这就是主要思路。

  • 实现

    题目中给出了一个w(刚开始我也不知所措啊QwQ),然而我们想一想,设一个f[i]表示将[i,i+w-1]区间浇水的天

    数,那么之后对于一个j,因为之前的第j-w盆肯定浇过,那么就可以减去那一盆的贡献,然后求出对于第j盆是否

    还需要再浇。

  • 代码

    /*二分加差分*/
    /*
    每次二分一个最小值,算出使每一个a
    都大于它至少要浇多少次,而之前(i-w)如果
    有浇过,那么可以减去那一次的次数 
    */
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define R register
    #define ll long long
    #define inf INT_MAX
    using namespace std;
    const int N=1e5+10;
    ll n,m,w;
    ll a[N],f[N];
    bool check(ll k)
    {
    ll rem=m,us=0;
    //还剩下的,已经用过的 
    for (int i=1;i<=n;i++)
    {
        if(i>=w) us-=f[i-w];
        //说明之前这个区间浇过水了
        f[i]=max((ll)0,k-us-a[i]);
        us+=f[i];
        rem-=f[i];
        if(rem<0) return 0; 
    }
    return 1;
    }
    int main()
    {
    scanf("%lld%lld%lld",&n,&m,&w);
    for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
    
    ll l=1,r=1e15,ans=0;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(check(mid)) ans=mid,l=mid+1;
        else r=mid-1;
    }
    
    printf("%lld\n",ans);
    
    return 0;
    }
每日一题 文章被收录于专栏

每天的题,为了牛币

全部评论

相关推荐

10-29 16:42
门头沟学院 Java
1.今天什么国标的公司打电话约面试,还得准备ppt,好麻烦,网上查薪资一般,打算拒了,不面了2.字节又复活了,什么安全开发,也不知道怎么样,面一面试试吧,还是挺想去字节的,但好难,随缘吧所以今天没面试
嵌入式的小白:面试前可以好好准备下 1.看看你投递的岗位的岗位描述,分析下是哪个业务线,同使要罗列他们描述中提到的技术点 2.根据1中的两点准备 3.岗位描述中应该还有语言要求,这个刷刷八股,要是对自己语言能力很有把握,那就不用看这点了 4.找下你简历中项目部分,看有没有和岗位描述中技术点重合的,这种在面试提到项目时,是高概率问题 好好准备,祝你面试顺利
我的求职进度条
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务