题目大意
现给出 A A A,反对人数 B B B,以及一个上限 L L L,请你将 A A A 比 B B B 化简为 A ′ A' A′ 比 B ′ B' B′,要求在 A ′ A' A′ 和 B ′ B' B′ 均不大于 L L L 且 A ′ A' A′ 和 B ′ B' B′ 互质(两个整数的最大公约数是 1 1 1)的前提下, A ′ : B ′ A':B' A′:B′≥ A : B A:B A:B 且 A ′ : B ′ − A : B A':B'- A:B A′:B′−A:B 的值尽可能小。
对于 100 % 100 \% 100% 的数据, 1 ≤ A ≤ 1000000 1 ≤ A ≤ 1000000 1≤A≤1000000, 1 ≤ B ≤ 1000000 1 ≤ B ≤ 1000000 1≤B≤1000000, 1 ≤ L ≤ 100 1 ≤ L ≤ 100 1≤L≤100, A : B ≤ L A:B ≤ L A:B≤L。
解题思路
仔细看 L L L 的范围,其实这题对 A A A 和 B B B 进行简单枚举,然后判断是否互质,再根据题目判断就行了。
AC CODE
#include <bits/stdc++.h>
using namespace std;
double a, b, c;
double mmin = 9999999.0;
double kkk;
int ans1, ans2;
int gcd(int x, int y)
{
if(y == 0) return x;
return gcd(y, x % y);
}
signed main()
{
scanf("%lf%lf%lf", &a, &b, &c);
kkk = (double)a * 1.0 / (b * 1.0);
for(int i = 1; i <= c; ++i)
{
for(int j = 1; j <= c; ++j)
{
if(gcd(i, j) == 1)
{
if((double)i * 1.0 / (j * 1.0) >= kkk)
if(mmin > (double)abs(kkk * 1.0 - i * 1.0 / (j * 1.0)))
{
mmin = (double)abs(kkk * 1.0 - i * 1.0 / (j * 1.0));
ans1 = i;
ans2 = j;
}
}
}
}
printf("%d %d", ans1, ans2);
return 0;
}