A. Bookshelf Filling of The 17th Heilongjiang Provincial Collegiate Programming Contest 二分+贪心

有个小小的问题..

就是为什么我们全队会都把这道题当成了模拟,然后在那边绞尽脑汁想可能漏掉的情况,现场没记错的话一共交了七发..

(至今没想起来我们是怎么wa掉辣么多发的!!而且实验室的队伍全过。了。。

正解:二分答案+贪心判断

二分的依据是答案显然满足单调性

贪心这个式子怎么来的?画张图!

最贪的情况就是下面的放满,上面的也放满

 

 其中res是n%b后的值(左边多出来的空间)

x是我们二分的答案,同时也是下面的书的数目,R是m本书减去放在左边后剩下的

如果上面的空间放得下下面剩余的(R-x),就是((res+x)/b)*(h-b)>=R-x这个表达式成立~return true 即可

你说要是纠结一下,有没有其他的放置呐?有啊,但是这个是极限情况,这个满足了,其他的都能满足;反之,x不符合条件。

 

#include<bits/stdc++.h>
using namespace std;
long long n,m,res,x,h,b,a,R;
bool check(long long x)
{
    if(((res+x)/b)*(h-b)>=R-x) return true;
    else return false;
}
int main()
{
    //("lys.in","r",stdin);
    
    int t;
    cin>>t;
    while(t--)
    {
        cin>>a>>b>>n>>m>>h;
        long long l=1,r=m,mid,ans;
        res=n%b;
        R=m-(n/b)*(h-a);
        
        while(l<=r)
        {
            mid=(l+r)/2;
            if(check(mid)) {
                ans=mid;
                r=mid-1;
            }
            else l=mid+1;
        }
        cout<<n+ans<<endl;
    }
}

 

posted @ 2022-07-14 10:40  liyishui  阅读(110)  评论(0)    收藏  举报