第十七届黑龙江省赛A.Bookshelf Filling

A

 

题意:n本A书高度为a,m本B书高度为b,b可以插入a与书柜的间隙中,求最终书摆放最小的宽度

思路:数学,二分

我们把要填充的图形分为两个个部分:

 

 对于状态一的部分我们可以区分为填充满了和没填充满两个状态,没填充满状态可以直接输出n+1

填充满了则进行下一步填充

设m为要从右边拿书的个数,hp为书橱高-b书高,我们可以推出不等式

(ll)ceil((double)m/hp)+m<=len(进行了第一步状态下这堆书的宽度)

此时我们可以二分m范围即可求得答案

note,特判hp为0情况,以及右边的书无论如何都得留一本

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline void solve()
{
    ll a,b,n,m,h;
    cin>>a>>b>>n>>m>>h;
    ll len=n+m;
    if(b<=n){
        ll c=n/b;
        if((b-a)*c>=m){
            cout<<n+1<<endl;return;
        }
        else m-=(b-a)*c;
    }
    if(m==1) cout<<n+1<<endl;
    else{
        ll len=m+n;
        ll hp=h-b;
        ll l=0,r=m-1;
        while(l<r){
            int mid=(l+r+1)/2;
            if((ll)ceil((double)mid/hp)+mid<=len) l=mid;
            else r=mid-1; 
        }
        cout<<len-l<<endl;
    }
}
int main()
{
    ll t;
    cin>>t;
    while(t--){
        solve();
    }
} 

 

posted on 2022-05-15 17:58  zesure  阅读(209)  评论(0编辑  收藏  举报

导航