嗯...
题目链接:https://www.luogu.org/problem/P2118
这道题的出题人很善良,l的范围不是很大,所以我们可以逐一枚举。
本题主要思想就是把所有的比例都转换为乘积的形式。
因为 i / j >= A / B
所以 i * B >= j * A
因为要找差距最小
所以 i / j < C / D
所以 i * D < j * C
综上所述,查找到的 i,j 应当满足 i * B >= j * A && i * D < j * C && i,j 的最小公因数为1。
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 4 using namespace std; 5 6 int a, b, c, d = 1, l; 7 8 inline int gcd(int x, int y){ 9 if(y == 0) return x; 10 return gcd(y, x % y); 11 } 12 13 int main(){ 14 scanf("%d%d%d", &a, &b, &l); 15 c = l; 16 for(int i = 1; i <= l; i++){ 17 for(int j = 1; j <= l; j++){ 18 if(gcd(i, j) == 1 && i * b >= j * a && i * d < j * c){ 19 c = i; 20 d = j; 21 } 22 } 23 } 24 printf("%d %d", c, d); 25 return 0; 26 }