BestCoder Round #52 (div.2)HDU5417 Victor and Machine


Victor and Machine

                                                          Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)
                                                                                     Total Submission(s): 582    Accepted Submission(s): 335


Problem Description
Victor has a machine. When the machine starts up, it will pop out a ball immediately. After that, the machine will pop out a ball every  w  seconds. However, the machine has some flaws, every time after  x  seconds of process the machine has to turn off for  y  seconds for maintenance work. At the second the machine will be shut down, it may pop out a ball. And while it's off, the machine will pop out no ball before the machine restart.

Now, at the  0  second, the machine opens for the first time. Victor wants to know when the  n -th ball will be popped out. Could you tell him?
 

Input
The input contains several test cases, at most  100  cases.

Each line has four integers  x y w  and  n . Their meanings are shown above。

1x,y,w,n100 .
 

Output
For each test case, you should output a line contains a number indicates the time when the  n -th ball will be popped out.
 

Sample Input
  
2 3 3 3 98 76 54 32 10 9 8 100
 

Sample Output
  
10 2664 939
 

Source



出题人:

首先是关于题意的问题,之前有人向我提出题意不清,对于y<w的情况,

没有说明该如何处理,但是在咨询了其他几个小伙伴之后,

我决定还是不修改题面了,因为题中已经说明了是“机器每次开启的瞬间”

也就是说机器关闭之后w就会清零。我不大清楚是否有人因为这个坑点

而被hack或者fst了,如果有的话,对此我只能表示遗憾。

因为数据范围很小,所以我们可以手动模拟,枚举每个小球弹出的时刻,

再特判一下机器的关闭情况就可以了。实际处理起来的话或许有些蛋疼,

但是,只要细心一点并且耐心一点,都是能够AC的。

另外一种解法就是推公式,我们发现,在机器每次开启的时间,

都有x/w+1个小球被弹出(无论w是否整除x),假设这个数目为a,

那么每弹出a个小球就需要花费x+y的时间,那么,第n个小球弹出的时刻

就是(n-1)/a*(x+y)+(n-1)%a*w。要注意的是,这里需要用(n-1)%a*w,

因为题中求的是第n个小球弹出的时刻等于是弹出n-1个小球所花费的时间,

然而,只要测试一下样例就能注意到这一点了。




#include
   
    
int main()
{
    int x,y,w,n;
    while(~scanf("%d%d%d%d",&x,&y,&w,&n))
    {
        int a=x/w+1;
        int sum=(n-1)/a*(x+y)+(n-1)%a*w;
        printf("%d\n",sum);
    }
    return 0;
}
   





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值