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


    版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/u011328934/article/details/26005267

    题目链接: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
    ");
                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
    ", cnt);
        }
        return 0;
    }
  • 相关阅读:
    经过改良后可以导出超过70000条数据的导出公共excel类
    一个简单的文档导出公共处理类
    网上找的正则验证邮箱手机等代码
    springMvc IE浏览器 前台中文参数 乱码问题解决方法
    国际化
    验证框架
    基于注解来装配Bean的属性
    aop
    自定义属性编辑器
    propertyPlaceholderConfigurer 和propertyOverrideConfigurer
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10701275.html
Copyright © 2020-2023  润新知