Link:http://acm.hdu.edu.cn/showproblem.php?pid=5417
Victor and Machine
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 84 Accepted Submission(s): 46
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?
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。
1≤x,y,w,n≤100 .
Each line has four integers x , y , w and n . Their meanings are shown above。
1≤x,y,w,n≤100 .
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
1000 Victor and Machine
首先是关于题意的问题,之前有人向我提出题意不清,对于y<w的情况,没有说明该如何处理,但是在咨询了其他几个小伙伴之后,我决定还是不修改题面了,因为题中已经说明了是“机器每次开启的瞬间”,也就是说机器关闭之后w就会清零。我不大清楚是否有人因为这个坑点而被hack或者fst了,如果有的话,对此我只能表示遗憾。
因为数据范围很小,所以我们可以手动模拟,枚举每个小球弹出的时刻,再特判一下机器的关闭情况就可以了。实际处理起来的话或许有些蛋疼,但是,只要细心一点并且耐心一点,都是能够AC的。
另外一种解法就是推公式,我们发现,在机器每次开启的时间,都有x/w+1个小球被弹出(无论w是否整除x),假设这个数目为a,那么每弹出a个小球就需要花费x+y的时间,那么,第n个小球弹出的时刻就是n/a*(x+y)+(n-1)%a*w。要注意的是,这里需要用(n-1)%a*w,因为题中求的是第n个小球弹出的时刻等于是弹出n-1个小球所花费的时间,然而,只要测试一下样例就能注意到这一点了。
AC code:
#include <stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#define LL long long
#define MAXN 1000100
using namespace std;
const int mod=1000000007;
int ans,cnt,tt;
int main()
{
int x,y,w,n,m,t;
while(scanf("%d%d%d%d",&x,&y,&w,&n)!=EOF)
{
m=x/w+1;
n--;
ans=(n/m)*(x+y)+(n%m)*w;
printf("%d\n",ans);
}
return 0;
}