hdu 4803 Poor Warehouse Keeper(贪心+数学)

题目链接:hdu 4803 Poor Warehouse Keeper

题目大意:有以个屏幕能够显示两个值。一个是数量x。一个是总价y。有两种操作。一种是加一次总价,变成x,x+y;一种是加一个数量,这要的话总价也会对应加上一个的价钱,变成x+1。y+y/x。总价显示的为取整后的整数,小数部分忽略。给定一个目标x。y,初始状态为1,1。求最少须要多少次能够目标状态,不能够达到的话输出-1.

解题思路:假设是加一次总价的话,单位价格就在变大;假设是加一次数量的话,单位价格是不变的。

总而言之,单位价格是仅仅会往上涨,而不会往下降的。
然后物品的数量也必须从1变成x,也就是说至少要加x-1次单位价格才干够。那么假设单位价格过大ss(x1)y+1肯定是不予许的。所以对于每个i(数量)来说,单位价格都有一个上限值。以保证说在添加数量的时候不会导致总价溢出。


设当前数量为i,临界总价为t。那么就有
y+1>txi
t<(y+1)ix

    即,每次对于一个数量,尽量加总价。使得单位价格尽量大,而且保证在和面加数量时不会大于上限,由于单位价格大的话,加一次数量总价接近目标值的速度会更快。
#include <cstdio>
#include <cstring>
#include <cmath>

const double eps = 1e-9;

int main () {
    double x, y;

    while (scanf("%lf%lf", &x, &y) == 2) {

        if (x > y) {
            printf("-1\n");
            continue;
        }

        double k = (y+1-eps) / x;
        int cnt = (int)x - 1;

        double tmp = 1;
        for (int i = 1; i <= (int)x; i++) {
            double t = i * k;
            int u = (int)(t-tmp);
            tmp += u;

            tmp = tmp * (i+1) / i;
            cnt += u;
        }
        printf("%d\n", cnt);
    }
    return 0;
}
posted @ 2018-01-12 16:49  zhchoutai  阅读(180)  评论(0编辑  收藏  举报