[蓝桥杯] 最大比例

最大比例

题目

X星球的某个大奖赛设了 M 级奖励。

每个级别的奖金是一个正整数。

并且,相邻的两个级别间的比例是个固定值。

也就是说:所有级别的奖金数构成了一个等比数列。

比如:16,24,36,54,其等比值为:3/2。

现在,我们随机调查了一些获奖者的奖金数。

请你据此推算可能的最大的等比值。

输入格式

第一行为数字 N ,表示接下的一行包含 N 个正整数。

第二行 N 个正整数 Xi,用空格分开,每个整数表示调查到的某人的奖金数额。

输出格式

一个形如 A/B 的分数,要求 A、B 互质,表示可能的最大比例系数。

数据范围

0<N<1000<Xi<10120<N<100 \\ 0<Xi<10^{12}
数据保证一定有解。

输入样例

3
1250 200 32

输出样例

25/4

题解

思路

  • 首先进行排序
  • 其次选取相邻两数之商的最大公因数作为公比
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 105;
long long a[N], b[N], x[N], cnt, n;

long long gcd(long long a, long long b) {
    return b ? gcd(b, a % b) : a;
}

long long gcd_sub(long long a, long long b) {
    if (a < b) swap(a, b);
    if (b == 1) return a;
    return gcd_sub(b, a / b);
}

int main () {
    cin >> n;
    for (int i = 0; i < n; i ++) cin >> x[i];
    
    sort(x, x + n);
    
    for (int i = 1; i < n; i ++) 
        if (x[i] != x[i-1]) {
            long long t = gcd(x[0], x[i]);
            a[cnt] = x[i] / t;
            b[cnt] = x[0] / t;
            cnt ++;
        }
    
    long long  up = a[0], down = b[0];
    for (int i = 0; i < cnt; i ++) {
        up = gcd_sub(up, a[i]);
        down = gcd_sub(down, b[i]);
    }
    
    cout << up << "/" << down;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章