HDU - 4803 - Poor Warehouse Keeper (思维)
2024-08-25 01:22:34
题意:
给出x,y两个值分别代表x个物品,总价为y
有两种变化:
1、使总价+1,数量不变
2、数量+1,总价跟着变化 (y = y + y / x)
思路:
给出目标x,y,计算最少变化次使数量变化的只有一种,所以至少需要x-1次变化。
每次增多数量的时候,先把单价提高到目标单价。(这样才会是最优解)
对于每一次增高单价,我们可以用 (int)(当前数量 * 目标单价 - 当前总价)
得到差值,这个差值,即变化的次数,因为一次变化1。
因为用了强转,所以会有精度问题,就是说我们在前面吧当前的单价变为了目标单价,但是由于强转,其实并没有单价一致,还需要继续变化
这里用for循环代表数量变化
剩下的用代码解释
#include<iostream>
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;
}
最新文章
- 使用css3制作蚂蚁线
- WCF基础教程之开篇:创建、测试和调用WCF
- div的显示和隐藏
- WEB前端常用网站收集
- Spring Controller 获取请求参数的几种方法
- 《DevOps故障排除:Linux服务器运维最佳实践》读书笔记
- Squish License
- CSS制作水平垂直居中对齐
- win8.1和centos6.5 双系统启动问题
- sqlserver修改增删改字段
- 用idea 创建一个spring小demo,基于xml文件配置
- 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)
- [leetcode]94. Binary Tree Inorder Traversal二叉树中序遍历
- Ubuntu 14.04 apt-get更换阿里云源
- r 随机数
- Git Diff 格式分析
- BZOJ3669 膜法森林 - LCT
- ADO----nDSN
- 雷林鹏分享:Ruby CGI方法
- ps -ef 输出具体含义
热门文章
- 国产手机没有google services 和google play崩溃,判断google services是否存在
- navicat导入.sql文件出错2006-MySQLserver has gone away
- Cpp module
- iOS核心动画以及UIView动画的介绍
- 什么是javascript闭包?
- UVaLive 6834 Shopping (贪心)
- Java 链式写法
- php insteadof 作用
- magento “Model collection resource name is not defined” 错误
- Storm概念学习系列之storm的雪崩