题意:屏幕上的计数只显示整数,从1 ,1开始达到x,y最少需要多少步。两种操作:1.y+1,2.x+1并且根据比例更新y 的值。
因为屏幕只显示整数部分,x范围比较小必定每次增加都是1,但是y可能会有小数,那么y考虑的范围应该在给定的基础上+0.999,因为这些都包含- -。
然后我们计算一下最终状态的比例p=y/x;以后所有的操作都是向这个比例进行靠拢,因为越接近这个比例在进行x+1的操作的时候y越接近与最终状态。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
using namespace std;
int main()
{
int n,m;
double x,y;
while(cin>>n>>m)
{
if(n>m)
{
printf("-1\n");
continue;
}
double p=1.0*(m+0.99999)/n;//计算最终状态的比例
x=1,y=1;
int ans=0;
while(1)
{
if(x==n&&(int)y==m)
break;
if(x==n)
{
ans+=m-(int)y;
break;
}
int yy=(int)(x*p);//计算当前x 根据最终比例对应的y
double zy=((x+1)/x)*(y-(int)y+yy);//判断一下如果拿着yy这个值当做当前值的话下一步理想状况的y值
double pi=zy/(x+1);//计算下一步理想状况的比例,
if(pi>p)//因为比例只会增加不会减少,如果现在大于了最终比例,那么肯定不能取得最优解,所以降低当前比例,进行修正
yy-=1;
ans+=yy-(int)y;
x+=1;
ans++;
y=(x/(x-1.0))*(y-(int)y+yy);
}
cout<<ans<<endl;
}
return 0;
}