Bookshelf Filling(二分)

输入:

4
2 5 5 8 5
2 4 5 7 5
2 6 5 2 6
3 4 3 2 5

输出:

10
8
7
4

题目大意:

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

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

AC代码:

#include<bits/stdc++.h>
using 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_61725823/article/details/124873929