Description
在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某观点表示支持的有 1498 人,反对的有 902 人,那么其比例可以简单地记为1498∶902。 因该比例的数值太大,难以一眼看出它们的关系。若把比例记为 5∶3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。 现给出支持人数 A 和反对人数 B,以及一个上限 L,请将 A 比 B 化简为 A′ 比 B′,要求在 A′和 B′ 均不大于 L,且 A′ 和 B′ 互质(两个整数的最大公约数为 1)的前提下,A′/B′≥ A/B 且 A′/B′-A/B 的值尽可能小。
Input
一行三个整数 A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限。
Output
一行两个整数 A′ 和 B′,中间用一个空格隔开,表示化简后的比例。
Accepted Code
#include <bits/stdc++.h> using namespace std; int gcd(int x, int y) //欧几里得算法求最大公因数 { int rem = 0; while (y > 0) { rem = x % y; x = y; y = rem; } return x; } int main() { double a, b, l; cin >> a >> b >> l; double h = a / b; double minm = 1000; int ans1 = 1, ans2 = 1; for (int a1 = 1; a1 <= l; a1++) //双循环暴力枚举获取两数的所有可能 { for (int b1 = 1; b1 <= l; b1++) { if (((double)a1 / (double)b1 >= h) && (minm - h > ((double)a1 / (double)b1) - h)) { minm = (double)a1 / (double)b1; ans1 = a1; ans2 = b1; } } } int y = gcd(ans1, ans2); cout << ans1 / y << " " << ans2 / y << endl; return 0; }
解后反思
本题略为有趣,本蒟蒻WA了足足五次,后来一顿乱改就过了,评测姬玄学错误。
再说这一题,暴力复杂度大约是1e4,完全可以接受,那就暴力遍历枚举,记录下差值,获取最小的一组最后gcd化简即可