hdu 4803 贪心

55 篇文章 0 订阅
19 篇文章 0 订阅

http://acm.split.hdu.edu.cn/showproblem.php?pid=4803

题意是两个数,x,y,x指个数,y指价值总和,两种操作,操作1:x+1(个数加一,总和在加一个单价,也就是y+=y/x),操作2:y+1(总和加一,个数不变,其实也相当于单价变高),问你从x=1,y=1开始,到达给的某个x1,y1,最少需要几步操作

可以去向单价方面考虑,既然要到达x1,y1这种状态,那么操作1的次数是固定的,并且操作1是不改变单价的,而操作2的次数是不确定的,并且操作2会更改单价,我们要使最后单价增加到y1/x1且尽量少的操作,必然就是每次操作2增加的单价尽可能的多最好,而操作2每次是使总价加1,也就是使单价加1/x,那么保证x尽可能的小必然就是最优的

所以每次进行操作1之前,都使用操作2把当前单价抬越高越好(且不超限)


还有精度1e-7往上都过不了。。。。。可能是写法的问题。。


#include<bits/stdc++.h>
const double eps=1e-5;
using namespace std;
int main()
{
	double x,y,x1,y1;
	while(~scanf("%lf %lf",&x,&y))
	{
		if(y<x)
		{
			printf("-1\n");
			continue;
		}
		int ans=0;
		y1=1;
		for(x1=1;x1<=x;x1++)
		{
			double now=(y+1-eps)*x1/x;//可以抬的最高当前总价
			int add=floor(now-y1);
			ans+=add;
			y1+=add;
			ans++;//操作1
			y1+=y1/x1;//操作1
		}
		printf("%d\n",ans-1);
	 } 
	return 0;
 }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值