hdu 1049 Climbing Worm
解题思路:
1. 两种情况,0x1:井深度小于一次跳的高度.0x2:井深度大于一次跳的高度
2.如果 属于 0x1 则一次跳出
3.否则 本次解题中直接枚举跳的次数
一直循环,直到 【每次跳的真实高度(一次高度减去滑下的高度)】*【次数(循环)】+【最后一次(一次的高度)】大于等于井深度
得到次数
4. 输出:次数*2+1
次数*2:每跳一次,休息一分钟
+1 :最后一跳,直接跳出井
Ac code:
#include<stdio.h> int main(void) { int n,u,d; int sum,i; while(scanf("%d%d%d",&n,&u,&d)!=EOF&&n) { if(n<=u)sum=1; else { for(i=1;; i++) if(n<=((u-d)*i+u)) break; sum=2*i+1; } printf("%d\n",sum); } return 0; }
错误版本,求大神指正:
sum 可以看成求得次数。
(n-u):去掉最后一跳
(u-d):每次跳的真实高度
取得最后一跳 / 每次的高度 , 并强制转换成 double +0.5
举例:
n=10 u=2 d=1: 8 / 1 +0.5 =8 ->8*2+1=17
n=20 u=3 d=1: 17 /2 +0.5=9->9*2+1=19
错的不知所云
#include<stdio.h> int main(void) { int n,u,d; int sum; while(scanf("%d%d%d",&n,&u,&d)!=EOF&&n) { sum=(int)(((double)(n-u)/(u-d))+0.5); printf("%d\n",sum*2+1 ); } return 0; }
经Taskr同学提醒: 10 9 1 该组测试数据发现问题
修正版AC代码:
1 #include<stdio.h> 2 int main(void) 3 { 4 int n,u,d; 5 int sum; 6 while(scanf("%d%d%d",&n,&u,&d)!=EOF&&n) 7 { 8 sum=ceil(((double)(n-u)/(u-d))); //仅修改了本行 9 printf("%d\n",sum*2+1 ); 10 } 11 return 0; 12 }