> 文档中心 > Bookshelf Filling(二分)

Bookshelf Filling(二分)


输入:

42 5 5 8 52 4 5 7 52 6 5 2 63 4 3 2 5

输出:

10874

题目大意:

先输入T,表示T组测试样例,然后每个测试样例依次输入a,b,n,m,h,分别表示小书的高,大书的高,小书的数量,大书的数量和书架的高,每本书的厚度都为1,初始状态都是小书放左边,大书放右边。

然后取k本大书放到如上图的空位,输出书所占的最小宽度是多少?

AC代码:

#includeusing namespace std;int n,m,a,b,H;bool check(int x){    long long nd=n+m-x;//nd表示取的k本大书    nd-=1ll*(H-a)*(n/b);//大书放在小书上面    if(nd<=0)return true;    int st=n%b,last=x-n;    last+=st;    nd-=1ll*(H-b)*(last/b);//大书放在大书的上面    if(nd<=0)return true;    return false;}int main(){    int T;    scanf("%d",&T);    while(T--){ scanf("%d%d%d%d%d",&a,&b,&n,&m,&H); int l=n+1,r=n+m,ans;//可以一开始就使用long long而不是int防止数据溢出 while(l<=r){     int mid=(1ll*l+r)/2;//1ll即1 long long参与运算将数据隐式转换成long long类型     if(check(mid))ans=mid,r=mid-1;     else l=mid+1; } printf("%ld\n",ans);    }    return 0;}