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;}