洛谷 P2118 比例简化(枚举)

嗯...

题目链接: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 }
AC代码
原文地址:https://www.cnblogs.com/New-ljx/p/11831871.html