458. 比例简化
在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。
例如,对某一观点表示支持的有1498人,反对的有902人,那么赞同与反对的比例可以简单的记为1498:902。
不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。
因为这个比例的数值太大,难以一眼看出它们的关系。
对于上面这个例子,如果把比例记为5:3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。
现给出支持人数A,反对人数B,以及一个上限L,请你将A:B化简为A′:B′,要求在A′和B′均不大于L且A′和B′互质(两个整数的最大公约数是1)的前提下,A′B′\frac{A'}{B'}B′A′ ≥ AB\frac{A}{B}BA且A′B′\frac{A'}{B'}B′A′ - AB\frac{A}{B}BA的值尽可能小。
输入格式
输入共一行,包含三个整数A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限。
输出格式
输出共一行,包含两个整数A′,B′,中间用一个空格隔开,表示化简后的比例。
数据范围
1≤A,B≤106,1≤A,B≤106,1≤A,B≤106,
1≤L≤100,A/B≤L1≤L≤100,A/B≤L1≤L≤100,A/B≤L
输入样例:
1498 902 10
输出样例:
5 3
思路:
题目已经给出了1≤L≤1001≤L≤1001≤L≤100,且要求A′和B′均不大于L。因此可以枚举 A′,B′的所有组合,然后判断:
A′,B′是否互质;- A′B′\frac{A'}{B'}B′A′是否大于等于 AB\frac{A}{B}BA,并且最小
事实上,上述算法可以省去对于 A′,B′ 是否互质的判断:
可以举个简单的例子,比如枚举到(10,4)的时候,那么之前我们肯定已经枚举过了(5,2)这种组合情况,因为10 - 4 > 5 - 2,所以我们会保留较小的那组(5,2),而最小的那组分子分母肯定是互质的。
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int A = sc.nextInt();
int B = sc.nextInt();
int L = sc.nextInt();
int a = 0,b = 1;//保留结果A',B'
double delta = Double.MAX_VALUE;
for(int i = 0;i <= L;i++){//i代表A'
for(int j = 1;j <= L;j++){// //j代表B',而分母不能为0,故从1开始
double x = (double)i / j;//按题意需要变为实数除法
double X = (double)A / B;
if(x >= X && x - X < delta){
a = i;
b = j;
delta = x - X;
}
}
}
System.out.println(a+ " " + b);
}
}

该博客探讨了如何将社交媒体上的民意调查结果以比例简化的方式呈现,以更直观地反映支持与反对的观点分布。文章介绍了一种算法,通过在不超过上限L的前提下,找到支持数A与反对数B的最佳简化比例A':B',使得A'B'/AB的值尽可能小,并确保A'和B'互质。提供的Java代码示例展示了实现这一算法的过程。
529

被折叠的 条评论
为什么被折叠?



