一道很基础的数学题,考察的就是高精度
在这里要注意输入10 1结果应该为13
但是输入9 1结果就应该为12,因为第4次滴玩3滴就结束了
可以滴水的过程发现是一个递增数列
所以前n项和为sum=n*(n+1)/2
当sum>=val时,说明已滴完,但是可能超出了val
所以要每次减d直到与val近似相等
因为担心除法过程中有精度损失,所以用的val*2.0
最近用纯c刷题好爽啊,写精简的代码特别干净
精度问题的产生就在于读入数据时产生了细微的误差
如输入1.0,读入浮点数很可能存储为1.000001或者0.999999
代码如下:(注意高精度esp的用法)
#include <stdio.h>
#define MAXN 5500
#define esp 1e-8
double v, d, cnt;
int i, ans;
int main(void) {
while(scanf("%lf%lf", &v, &d) != EOF) {
for(i=1; ; ++i) {
cnt = (i*i*1.0+i*1.0)*d;
if(cnt - v*2.0 >= -esp) {
ans = (i*i+3*i)/2-1;
while((cnt-=2.0*d) - v*2.0 >= -esp)
ans--;
printf("%d\n", ans);
break;
}
}
}
return 0;
}