hdu 5417 Victor and Machine

题目:

Victor有一个机器,这个机器每次开启的瞬间会弹出一个小球,之后每隔ww秒会弹出一个小球。因为机器不是很完善,该机器每开启xx秒就得关闭yy秒进行调整,在机器关闭的瞬间可能会有小球弹出,关闭之后一直到下一次开启之前都不会有小球弹出。

00时刻,机器第一次开启,Victor想要知道第nn个小球弹出的时刻,你能够告诉他吗?


分析:

当x<w时,显然只有在每次机器开启的时刻,才会弹出一个球,0时刻已经弹出一个,那么第n个球弹出的时刻为:(n-1)*(x+y)

当x>=w时,每个周期(开启到关闭机器持续时间x+y)弹出的球个数为1+x/w个,设为p=1+x/w,令T=n/p,如果p能够整除n,那么将会在第T个周期弹出第n个球,弹出的时刻为(T-1)*(x+y)+x/w*w;若p不能整除n,那么将在第T+1个周期弹出第n个球,弹出时刻为T*(x+y)+(n-1)%p*w。注意后面是(n-1)%p*w,因为除去在0时刻弹出的那个球,弹出的球实际上是第n-1个。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main()
{
    int x,y,w,n;
    while(~scanf("%d%d%d%d",&x,&y,&w,&n))
    {
        int ans;
        if(x>=w)
        {
            int p=1+x/w;
            if(n%p==0) ans=(n/p-1)*(x+y)+w*(x/w);
            else ans=n/p*(x+y)+(n-1)%p*w;
        }else ans=(n-1)*(x+y);
        printf("%d\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值