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 @   liyishui  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示