我正在解决有关Codechef Cookoff 2019的问题(代码:TWOVRIBL)。 链接到问题:https://www.codechef.com/COOK108B/problems/TWOVRIBL
我的方法:我尝试使用Binary Search查找P。目标是找到X达到Xf的最大步骤数。
-选择任何正整数P使得P⋅P> Y。 -将X更改为P。 -将P⋅P加到Y。 所以我想得到最大的答案,我需要选择P使得P.P> Y 和P
请帮助! //我的代码:
#include <iostream>
using namespace std;
int find(long y_sqr,long X,long Xf)
{
int left=X+1,right=1000,mid;
long num=0,distance_from_X=99990;
while(left<=right)
{
mid=(left+right)/2;
if(mid*mid<=y_sqr)
{
left=mid+1;
}
else
{
if(mid-X < distance_from_X)
{
num=mid;
distance_from_X=mid-X;
}
right=mid-1;
}
}
return num;
}
int main()
{
long T;
cin>>T;
while(T--)
{
long Xf;
cin>>Xf;
long X=0,Y=0,P=0,steps=0;
while(P < Xf)
{
P=find(Y,X,Xf);
if(P*P<=Xf*Xf)
{
Y+=P*P;
X=P;
steps++;
}
}
if(P!=X)
{steps++;}
cout<<steps<<" ";
}
return 0;
}