博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU - 4803 - Poor Warehouse Keeper (思维)
阅读量:6573 次
发布时间:2019-06-24

本文共 1166 字,大约阅读时间需要 3 分钟。

题意:

给出x,y两个值分别代表x个物品,总价为y

有两种变化:
1、使总价+1,数量不变
2、数量+1,总价跟着变化 (y = y + y / x)

思路:

给出目标x,y,计算最少变化次使数量变化的只有一种,所以至少需要x-1次变化。

每次增多数量的时候,先把单价提高到目标单价。(这样才会是最优解)

对于每一次增高单价,我们可以用 (int)(当前数量 * 目标单价 - 当前总价) 得到差值,这个差值,即变化的次数,因为一次变化1。
因为用了强转,所以会有精度问题,就是说我们在前面吧当前的单价变为了目标单价,但是由于强转,其实并没有单价一致,还需要继续变化

这里用for循环代表数量变化

剩下的用代码解释

#include
using namespace std;int main() { double a, b; while (~scanf("%lf %lf", &a, &b)) { if (a > b) { printf("-1\n");//无解情况 } else { double index = (b + 1 - 1e-6) / a; //因为给出的总价可能是取整的,还原精度,这里精度不能太高会出错 int ans = (int) a - 1; //数量变化直接计入结果 double nowTotal = 1; //当前总价 for (int i = 1; i <= (int) a; i++) { int tmp = (int) (i * index - nowTotal); //用当前数量*目标总价-当前总价=总价的差值,这也是变化的次数 nowTotal += tmp; //改变当前总价 ans += tmp; //计入变化次数 nowTotal = nowTotal * (i + 1) / i; //这里用的for循环代表每次数量变化,当数量变化后,总价是需要变化的 } printf("%d\n", ans); } } return 0;}

转载于:https://www.cnblogs.com/somliy/p/9705519.html

你可能感兴趣的文章
[清华集训2014]玛里苟斯
查看>>
Doctype作用?严格模式与混杂模式如何区分?它们有何意义
查看>>
0029-求最小的数
查看>>
【MVC+EasyUI实例】对数据网格的增删改查(上)
查看>>
第三章:如何建模服务
查看>>
EF CodeFirst下数据库更新
查看>>
Project Euler 345: Matrix Sum
查看>>
mysql允许远程登录
查看>>
你可能不知道的技术细节:存储过程参数传递的影响
查看>>
POJ1703 Find them, Catch them
查看>>
自适应备忘录 demo
查看>>
HTML转义字符大全(转)
查看>>
[摘录]调动员工积极性的七个关键
查看>>
Linux getcwd()的实现【转】
查看>>
Backup Volume 操作 - 每天5分钟玩转 OpenStack(59)
查看>>
.htaccess 基础教程(四)Apache RewriteCond 规则参数
查看>>
转: maven进阶:一个多模块项目
查看>>
Android控件之HorizontalScrollView 去掉滚动条
查看>>
UVM中的class--2
查看>>
任务调度器配置文件
查看>>