2 3 3 3 98 76 54 32 10 9 8 100
10 2664 939
/************************************************************************/
附上该题对应的中文题
Victor有一个机器,这个机器每次开启的瞬间会弹出一个小球,之后每隔w秒会弹出一个小球。因为机器不是很完善,该机器每开启x秒就得关闭y秒进行调整,在机器关闭的瞬间可能会有小球弹出,关闭之后一直到下一次开启之前都不会有小球弹出。 0时刻,机器第一次开启,Victor想要知道第n个小球弹出的时刻,你能够告诉他吗?
包含多组测试数据(最多一百组),每组测试数据一行。 每行有四个由空格隔开的整数,分别为x、y、w和n,其含义如题中所示。 1≤x,y,w,n≤100。
每组测试数据输出一行一个整数,即第n个小球弹出的时刻。
2 3 3 3 98 76 54 32 10 9 8 100
10 2664 939
出题人的解题思路:
首先是关于题意的问题,之前有人向我提出题意不清,对于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个小球所花费的时间,然而,只要测试一下样例就能注意到这一点了。
该题还是比较水的吧,无非就分三种情况:③剩下的归为一种情况,第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; }菜鸟成长记