2703 - 坚果

通过次数

0

提交次数

0

时间限制 : 2 秒 内存限制 : 2048 MB

你有a个坚果和许多盒子,这些盒子有一个非常完美的特点:如果你把x个隔板放进这个盒子里面,你的盒子将会分成x+1部分。你是一个苛刻的人,因此,一方面你反对将一个盒子分成超过k部分,另一方面,你也不喜欢盒子的每一部分能够盛放的坚果超过v个,如果你有b个隔板,你想要把所有的坚果都放到盒子里面,你最少需要多少个盒子。(单击提示有惊喜)

题目输入

    第一行输入一个T,代表有T组测试数据。接下来每组含有四个整数k,a,b,v(2<=k<=1000,1<=a,b,v<=1000),分别表示一个盒子最多分成几部分,坚果的数量,隔板的数量和盒子的每一部分最多能够盛多少坚果。

题目输出

    输出最少需要的盒子数量。

输入/输出样例

输入格式

3
3 10 3 3
3 10 1 3
100 100 1 1000

输出格式

2
3
1

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

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