HDU - 4803 Poor Warehouse Keeper 贪心 + 思维

54 篇文章 0 订阅
23 篇文章 0 订阅

题意:给出两种操作:

如果按下按钮1,会使数量+1,总价对应增长单价数目(因此按下按钮1不会改变单价)

如果按下按钮2,会使总价加1,数量不变(按下按钮2会使单价增加)

现在问至少多少步可以使得   按钮1数字为x, 按钮2数字为y;

思路:很明显的贪心思路是先按按钮2到一定单价,然后按一下按钮1,重复此步骤直到满足题意,但是关键是按钮2每次要按多少下,其实这取决于最后的单价,因为单价只能变大不能变小,因我们每一步操作都要保证单价不能超过最终单价的大小,分析到这,就可以求出每次贪心按y的上限了,要注意的一点就是最终总价只是要显示出来的是y,并不一定真正是y,但一定不会大于等于 y + 1.

PS:eps 从1e-1到1e-6都能过,再高就会wa

代码:

#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-4;
int main()
{
	double x, y;
	while(~scanf("%lf %lf", &x, &y))
	{
		if(x > y)
		{
			printf("-1\n"); continue;
		}
		int ans = x - 1, delta;
		double one = (y + 1 - eps) / x; // 单价 
		double pre = 1; //上一次y的真实值 
		for(int i = 1; i < x + eps; i++)
		{
			delta = floor(one * i - pre);
			ans += delta;
			pre += delta;
			pre = pre / i * (i + 1); // 按一次x以后的效果 
		}
		printf("%d\n", ans);
	}	
 	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值