二分,先预处理出所有的1000*1000个分数的值一次排序,每次读入二分查找找误差最小的即可
坑点:答案有可能是0/1,WA了3次
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int cnt = 0;
struct fenshu {
double a;
int fz,fm;
int gcd(int a,int b) {
return a % b == 0 ? b : gcd(b,a % b);
}
void huaj() {
if(fz == 0) fm = 1;
else {
int hj = gcd(fm,fz);
fz /= hj, fm /= hj;
}
}
bool operator < (const fenshu& b) const {
return a < b.a;
}
}fs[1001*1001];
double sear[1001003];
void initi()
{
for(int i = 0;i <= 1000; i++) {
for(int j = i==0 ? i+1 : i;j <= 1000; j++) {
fs[cnt].a = (double)i / j;
fs[cnt].fz = i;
fs[cnt].fm = j;
fs[cnt].huaj();
cnt++;
}
}
sort(fs,fs+cnt);
for(int i = 0; i < cnt; i++) sear[i] = fs[i].a;
}
int main()
{
initi();
int T; scanf("%d",&T);
while(T--) {
double k;
scanf("%lf",&k);
int wz = lower_bound(sear, sear + cnt, k) - sear;
if(wz>0) if(fabs(fs[wz-1].a - k) < fabs(fs[wz].a - k)) wz--;
printf("%d/%d\n", fs[wz].fz, fs[wz].fm);
}
return 0;
}