O(n)可以解决这道题
因为分子分母都在[1,L]中,对于每一个分母,都可以O(1)找到一个分子使 分子/分母 最接近A然后比较出最小误差即可
由于在二分专题里面,所以应该是有O(lgn)解法
但我不会
嘻嘻嘻:p
网上还有好像叫追赶法
#include <cstdio>
#include <cmath>
using namespace std;
double A, esp;
int ans1, ans2, L; //ans1为分子,ans2为分母
int main()
{
scanf("%lf%d", &A, &L);
ans1 = ans2 = 1; //找一个保底的做初值
esp = fabs(A-1); //初值的eps
for (int i = 1; i <= L; i++) { //枚举分母
int j = i*A+0.5; //对分母算最接近的分子(要加0.5因为要最接近的所以四舍五入)
if (j>L) j=L; //不能超过L
if (j<1) j=1; //不能小于1
double eps = fabs(A-1.0*j/i);
if (eps < esp) { //比较误差
esp = eps;
ans1 = j;
ans2 = i;
}
}
printf("%d %d\n", ans1, ans2);//我觉得还是加个gcd比较好,但是上面比较时用的<也就没关系了
return 0;
}