游客 Signup | Login
中文 | En

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个坚果,还剩下一个坚果放到第二个盒子里面。

Time Limit 2 seconds
Memory Limit 2048 MB
Discuss Stats
上一题 下一题