第十七届黑龙江省赛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(); } }