1 条题解

  • 0
    @ 2025-8-24 21:56:02

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Drinkkk
    **

    搬运于2025-08-24 21:56:02,当前版本为作者最后更新于2018-01-07 12:28:12,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    2020分思路:我们先模拟每棵树树每个月的高度,再看看这个数的高度是否大于或等于LL,如果是就将当前截下的木材长度加上LL,然后将这棵树的高度减去LL即可,如果我们假设当前已经截下的木材长度为dada,且现在是第ansans个月的话,那么当da>=Lda>=L时就要打印ansans并跳出循环了。

    4040分思路:我们先模拟每棵树树每个月的高度,再看看这个数的高度是否大于或等于LL,如果是就将当前截下的木材长度加上hih_i,然后将这棵树的高度设为00即可,如果我们假设当前已经截下的木材长度为dada,且现在是第ansans个月的话,那么当da>=Lda>=L时就要打印ansans并跳出循环了。

    4545分思路:在模拟每棵树的高度之前我们需要先判断一下在第00个月时可否完成订单,若能够完成订单就输出00,否则就继续循环枚举。

    6060分思路:将我们的程序里的所有intint类型的变量都转化为longlong longlong类型的。因为1<=S,L<=10181<=S,L<=10^{18}

    7575分思路:使用二分查找,将ll设为00,且将rr设为∞,这样midmid就是⌊l+r2\frac{l+r}{2}⌋。那么,在第midmid个月时,hih_i'=hi+aimidh_i+a_i*mid,统计一下在第midmid个月是能否完成订单即可,若能够完成订单就将r=midr=mid,否则就将l=midl=mid,当rl>1r-l>1时进行循环,所以最终的答案就是rr,如果你还不明白什么是二分查找下面将给出一个l=1,r=10l=1,r=10的例子,其中浅绿色的格子代表ll,深绿色的格子代表rr,黄色的格子代表将要查找的点,浅蓝色的格子代表midmid

    8585分思路:将程序内的所有longlong longlong转化为unsignedunsigned longlong longlong即可,其余同7575分思路。

    100100分思路:先将rr设为max(S,L)max(S,L),再将rr'设为min(rmin(r',(rhi)/ai+1)(r-h_i)/a_i+1)即可,再将所有的intint转化为unsignedunsigned longlong longlong即可。其余同8585分思路。

    2020分代码:

    #include <cstdio>
    int h[1000001],a[1000001];
    int main()
    {
        int ans=0,n=0,x=0,y=0;
        scanf("%d %d %d",&n,&x,&y);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&h[i]);
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        while(++ans)
        {
            for(int i=1;i<=n;i++)
            {
                h[i]+=a[i];
                if(h[i]>=y)
                {
                    x-=y;
                    h[i]-=y;
                }
            }
            if(x<=0)
            {
                break;
            }
        }
        printf("%d",ans);
        return 0;
    }
    

    4040分代码:

    #include <cstdio>
    int h[1000001],a[1000001];
    int main()
    {
        int ans=0,n=0,x=0,y=0;
        scanf("%d %d %d",&n,&x,&y);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&h[i]);
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        while(++ans)
        {
            for(int i=1;i<=n;i++)
            {
                h[i]+=a[i];
            }
            int da=0;
            for(int i=1;i<=n;i++)
            {
                if(h[i]>=y)
                {
                    da+=h[i];
                }
            }
            if(da>=x)
            {
                break;
            }
        }
        printf("%d",ans);
        return 0;
    }
    

    4545分代码:

    #include <cstdio>
    int h[1000001],a[1000001];
    int main()
    {
        int ans=0,n=0,x=0,y=0;
        scanf("%d %d %d",&n,&x,&y);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&h[i]);
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        int da=0;
        for(int i=1;i<=n;i++)
        {
            if(h[i]>=y)
            {
                da+=h[i];
            }
        }
        if(da>=x)
        {
            printf("0");
            return 0;
        }
        while(++ans)
        {
            for(int i=1;i<=n;i++)
            {
                h[i]+=a[i];
            }
            int da=0;
            for(int i=1;i<=n;i++)
            {
                if(h[i]>=y)
                {
                    da+=h[i];
                }
            }
            if(da>=x)
            {
                break;
            }
        }
        printf("%d",ans);
        return 0;
    }
    

    6060分代码:

    #include <cstdio>
    long long h[1000001],a[1000001];
    int main()
    {
        long long ans=0,n=0,x=0,y=0;
        scanf("%lld %lld %lld",&n,&x,&y);
        for(long long i=1;i<=n;i++)
        {
            scanf("%lld",&h[i]);
        }
        for(long long i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
        }
        long long da=0;
        for(long long i=1;i<=n;i++)
        {
            if(h[i]>=y)
            {
                da+=h[i];
            }
        }
        if(da>=x)
        {
            printf("0");
            return 0;
        }
        while(++ans)
        {
            for(long long i=1;i<=n;i++)
            {
                h[i]+=a[i];
            }
            long long da=0;
            for(long long i=1;i<=n;i++)
            {
                if(h[i]>=y)
                {
                    da+=h[i];
                }
            }
            if(da>=x)
            {
                break;
            }
        }
        printf("%lld",ans);
        return 0;
    }
    

    7575分代码:

    #include <cstdio>
    long long h[1000001],a[1000001];
    int main()
    {
        long long ans=0,l=0,r=0,n=0,x=0,y=0;
        scanf("%lld %lld %lld",&n,&x,&y),r=999999999;
        for(long long i=1;i<=n;i++)
        {
            scanf("%lld",&h[i]);
        }
        for(long long i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
        }
        long long da=0;
        for(long long i=1;i<=n;i++)
        {
            if(h[i]>=y)
            {
                da+=h[i];
            }
        }
        if(da>=x)
        {
            printf("0");
            return 0;
        }
        long long nh[200001];
        while(r-l>1)
        {
            long long mid=(l+r)/2;
            for(long long i=1;i<=n;i++)
            {
                nh[i]=h[i]+mid*a[i];
            }
            long long da=0;
            for(long long i=1;i<=n;i++)
            {
                if(nh[i]>=y)
                {
                    da+=nh[i];
                }
            }
            if(da>=x)
            {
                r=mid;
            }
            else
            {
                l=mid;
            }
        }
        printf("%lld",r);
        return 0;
    }
    

    8585分代码:

    #include <cstdio>
    unsigned long long h[1000001],a[1000001];
    int main()
    {
        unsigned long long l=0,r=0,n=0,x=0,y=0;
        scanf("%llu %llu %llu",&n,&x,&y),r=999999999;
        for(unsigned long long i=1;i<=n;i++)
        {
            scanf("%llu",&h[i]);
        }
        for(unsigned long long i=1;i<=n;i++)
        {
            scanf("%llu",&a[i]);
        }
        unsigned long long da=0;
        for(unsigned long long i=1;i<=n;i++)
        {
            if(h[i]>=y)
            {
                da+=h[i];
            }
        }
        if(da>=x)
        {
            printf("0");
            return 0;
        }
        unsigned long long nh[200001];
        while(r-l>1)
        {
            unsigned long long mid=(l+r)/2;
            for(unsigned long long i=1;i<=n;i++)
            {
                nh[i]=h[i]+mid*a[i];
            }
            unsigned long long da=0;
            for(unsigned long long i=1;i<=n;i++)
            {
                if(nh[i]>=y)
                {
                    da+=nh[i];
                }
            }
            if(da>=x)
            {
                r=mid;
            }
            else
            {
                l=mid;
            }
        }
        printf("%llu",r);
        return 0;
    }
    

    100100分代码:

    #include <cstdio>
    unsigned long long h[1000001],a[1000001];
    unsigned long long min(unsigned long long x,unsigned long long y)
    {
        return x<y?x:y;
    }
    unsigned long long max(unsigned long long x,unsigned long long y)
    {
        return x>y?x:y;
    }
    int main()
    {
        unsigned long long now=0,l=0,r=0,n=0,x=0,y=0;
        scanf("%llu %llu %llu",&n,&x,&y),now=r=max(x,y);
        for(unsigned long long i=1;i<=n;i++)
        {
            scanf("%llu",&h[i]);
        }
        for(unsigned long long i=1;i<=n;i++)
        {
            scanf("%llu",&a[i]);
            r=min(r,(now-h[i])/a[i]+1);
        }
        unsigned long long da=0;
        for(unsigned long long i=1;i<=n;i++)
        {
            if(h[i]>=y)
            {
                da+=h[i];
            }
        }
        if(da>=x)
        {
            printf("0");
            return 0;
        }
        unsigned long long nh[200001];
        while(r-l>1)
        {
            unsigned long long mid=(l+r)/2;
            for(unsigned long long i=1;i<=n;i++)
            {
                nh[i]=h[i]+mid*a[i];
            }
            unsigned long long da=0;
            for(unsigned long long i=1;i<=n;i++)
            {
                if(nh[i]>=y)
                {
                    da+=nh[i];
                    if(da>=x)
                    {
                        break;
                    }
                }
            }
            if(da>=x)
            {
                r=mid;
            }
            else
            {
                l=mid;
            }
        }
        printf("%llu",r);
        return 0;
    }
    
    • 1

    信息

    ID
    3020
    时间
    1000ms
    内存
    500MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者