HDU 5417 Victor and Machine——BestCoder Round #52(div.2)
2015-08-22 21:40
405 查看
Victor and Machine
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)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。
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
BestCoder Round #52 (div.2)
/************************************************************************/
附上该题对应的中文题
Victor and Machine
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 131072/65536 K (Java/Others)
问题描述
Victor有一个机器,这个机器每次开启的瞬间会弹出一个小球,之后每隔ww秒会弹出一个小球。因为机器不是很完善,该机器每开启xx秒就得关闭yy秒进行调整,在机器关闭的瞬间可能会有小球弹出,关闭之后一直到下一次开启之前都不会有小球弹出。 00时刻,机器第一次开启,Victor想要知道第nn个小球弹出的时刻,你能够告诉他吗?
输入描述
包含多组测试数据(最多一百组),每组测试数据一行。 每行有四个由空格隔开的整数,分别为xx、yy、ww和nn,其含义如题中所示。 1\leq x,y,w,n\leq 1001≤x,y,w,n≤100。
输出描述
每组测试数据输出一行一个整数,即第nn个小球弹出的时刻。
输入样例
2 3 3 3 98 76 54 32 10 9 8 100
输出样例
10 2664 939
/****************************************************/
出题人的解题思路:
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个小球所花费的时间,然而,只要测试一下样例就能注意到这一点了。
该题还是比较水的吧,无非就分三种情况:
①w时间内只有启动时有小球弹出,即x/w+1==1,这样的情况下前n-1个小球都是要花费一周期时间的,即x+y,而最后一个小球不需要时间,因为一启动就有小球弹出,故第n个小球弹出时间T=(n-1)*(x+y)
②n正好能被每个周期弹出的小球数整除,这种情况下,最后一个周期是不需要花费一整个周期的,所以第n个小球弹出的时间T=t*(x+y)+(s-1)*w (s=x/w+1 t=n/s-1)
③剩下的归为一种情况,第n个小球弹出的时间T=t*(x+y)+(n-t*s-1)*w (s=x/w+1 t=n/s)
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<stdlib.h>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#define exp 1e-10
using namespace std;
const int N = 16;
const int inf = 2147483647;
const int mod = 2009;
int main()
{
int x,y,w,n,s,t;
while(~scanf("%d%d%d%d",&x,&y,&w,&n))
{
s=x/w+1;
if(s==1)
printf("%d\n",(n-1)*(x+y));
else if(n%s==0)
{
t=n/s-1;
printf("%d\n",t*(x+y)+(s-1)*w);
}
else
{
t=n/s;
printf("%d\n",t*(x+y)+(n-t*s-1)*w);
}
}
return 0;
}菜鸟成长记
相关文章推荐
- 接口关系下的多态
- hdu 5419 Victor and Toys 线段树成段更新
- 开发工具之Eclipse快捷键
- 换钱的方法数(动态规划讲的很好)
- 强制类型转换
- OC中protocol协议
- 封装RabbitMQ.NET Library 的一点经验总结
- 封装RabbitMQ.NET Library 的一点经验总结
- Jetty学习(三)--jetty部署spring mvc项目
- 构造函数的顺序
- codeforces 515C. Drazil and Factorial
- 安卓开发文档自翻译~(1)--adb
- 钻石继承和虚继承
- Ubuntu下安装搜狗输入法
- C指针决心 ------ 指针表达式
- 关于产品经理的学习
- ECMAScript6学习笔记《二》-----“const命令与let命令”
- (HTML部分)特供.Net基础全套视频教程2014版(第十八天)(更新于2015年10月24日02:23:36)
- FMDB与GCD
- 黑马程序员10java高新技术