输入:
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;
}