2703 - 坚果
你有a个坚果和许多盒子,这些盒子有一个非常完美的特点:如果你把x个隔板放进这个盒子里面,你的盒子将会分成x+1部分。你是一个苛刻的人,因此,一方面你反对将一个盒子分成超过k部分,另一方面,你也不喜欢盒子的每一部分能够盛放的坚果超过v个,如果你有b个隔板,你想要把所有的坚果都放到盒子里面,你最少需要多少个盒子。(单击提示有惊喜)
Input
第一行输入一个T,代表有T组测试数据。接下来每组含有四个整数k,a,b,v(2<=k<=1000,1<=a,b,v<=1000),分别表示一个盒子最多分成几部分,坚果的数量,隔板的数量和盒子的每一部分最多能够盛多少坚果。
Output
输出最少需要的盒子数量。
Examples
Input
3 3 10 3 3 3 10 1 3 100 100 1 1000
Output
2 3 1
Hint
对于第一组测试样例,我们可以将第一个盒子分成三部分,然后每一部分盛放三个坚果,所以第一个盒子能够盛放9个坚果,还剩下一个坚果放到第二个盒子里面。
Solution C
#include<stdio.h> int main() { int t,k,a,b,v,x,y,c,ans; scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&k,&a,&b,&v); x=a/v; if(a%v) x++; c=x/k*(k-1); if(x%k) c+=x%k-1; if(c<=b) { ans=x/k; if(x%k) ans++; } else { ans=x-b/(k-1)*(k-1); if(b%(k-1)) ans-=b%(k-1); } printf("%d\n",ans); } return 0; }
Solution C++
#include<stdio.h> int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int k,a,b,v,t; scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&k,&a,&b,&v); int ans=0,box=0,kk=k-1; while(ans<a) { if(b>=kk) { ans+=v*k; b-=kk; box++; } else if(b>0) { ans+=(b+1)*v; b=0; box++; } else if(b==0) { ans+=v; box++; } } printf("%d\n",box); } return 0; }
Hint
对于第一组测试样例,我们可以将第一个盒子分成三部分,然后每一部分盛放三个坚果,所以第一个盒子能够盛放9个坚果,还剩下一个坚果放到第二个盒子里面。