首页 > ACM题库 > HDU-杭电 > HDU 1408 盐水的故事[解题报告] C++
2013
12-09

HDU 1408 盐水的故事[解题报告] C++

盐水的故事

问题描述 :

挂盐水的时候,如果滴起来有规律,先是滴一滴,停一下;然后滴二滴,停一下;再滴三滴,停一下…,现在有一个问题:这瓶盐水一共有VUL毫升,每一滴是D毫升,每一滴的速度是一秒(假设最后一滴不到D毫升,则花费的时间也算一秒),停一下的时间也是一秒这瓶水什么时候能挂完呢?

输入:

输入数据包含多个测试实例,每个实例占一行,由VUL和D组成,其中 0<D<VUL<5000。

输出:

对于每组测试数据,请输出挂完盐水需要的时间,每个实例的输出占一行。

样例输入:

10 1

样例输出:

13

2011-12-20 07:55:14

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1408

题意:中文。

mark:输入其实是实数。。。题目没说清楚。OLE了一次,wa了好几次,都是精度惹的祸。

过了以下测试数据应该就没大问题了。

intput

10 1

11 1

1 0.1

1.1 0.1

 

output

13

15

13

15

代码:

# include <stdio.h>


int main ()
{
    double vul, d ;
    int i, ans ;
    while (~scanf ("%lf%lf", &vul, &d))
    {
        for (i = 1 ; ; i++)
            if (i*(i+1)/2 >= vul / d) break ;
        ans = (i-1)*i/2 ;
        vul -= ans*d ;
        ans += (int)((vul-1e-9)/d+1) + (i-1) ;
        printf ("%d\n", ans) ;
    }
}

解题报告转自:http://www.cnblogs.com/lzsz1212/archive/2012/01/06/2315275.html


  1. 为什么for循环找到的i一定是素数叻,而且约数定理说的是n=p1^a1*p2^a2*p3^a3*…*pk^ak,而你每次取余都用的是原来的m,也就是n

  2. #include <cstdio>

    int main() {
    //answer must be odd
    int n, u, d;
    while(scanf("%d%d%d",&n,&u,&d)==3 && n>0) {
    if(n<=u) { puts("1"); continue; }
    n-=u; u-=d; n+=u-1; n/=u;
    n<<=1, ++n;
    printf("%dn",n);
    }
    return 0;
    }