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;
}