HDU 4803 Poor Warehouse Keeper(贪心+注意精度) 13区域赛

来源:互联网 发布:淘宝pr剪切教程 编辑:程序博客网 时间:2024/05/29 06:37
题意 :屏幕可以显示两个值,一个是数量x,一个是总价y。有两种操作,一种是加一次总价,变成x,1+y;一种是加一个数量,这要的话总价也会相应加上一个的价钱,变成x+1,y+y/x。总价显示的为取整后的整数,小数部分忽略。给定一个目标x,y,初始状态为1,1,求最少需要多少次可以目标状态,不可以达到的话输出-1.

太需要这个地方的精度问题了。。
都不知道为什么别人的这种方式能过。。

贪心的策略是,每次尽量加价格,加到能满足条件的最大值,然后加一下数量,这样反复直到到达答案。然后加到满足条件最大值一步不能模拟,可以推一下公式就能直接算出来了
#include <stdio.h>#include <string.h>const double eps = 1e-9;double x, y;int main() {    while (~scanf("%lf%lf", &x, &y)) {        if (x > y) {            printf("-1\n");            continue;        }        double s = (y + 1 - eps) / x;        double tmp = 1;        int count = (int)x - 1;        for (int i = 1; i <= (int)x; i++) {            int sb = (int)(s * i - tmp);            tmp += sb;            //printf("%lf %lf\n",(double)i, (double)tmp);            tmp = tmp / i * (i + 1);            count += sb;        }        printf("%d\n", count);    }    return 0;}