7、最大比例

题目 最大比例

image-ffcf9d08

思路分析

有点像数论里那道等差的 求什么最大公约数

然后就照着这个gcd的思路随便蒙了一下

排序 相邻元素一定存在一个公比 找最大的公比 然后化简

过了一个……

#include<bits/stdc++.h>

using namespace std;

const int N=110;

int a[N];

int main() {

    int n; cin >> n;

    for(int i = 0; i < n; i++)

        cin >> a[i];

    sort(a, a + n);

    int maxq = -1, fm = 0, fz = 0;

    for(int i = 0; i + 1 < n; i++) {

        if(a[i] == 0)

            continue;

        int curq = a[i + 1] / a[i];

        if(curq > maxq) {

            maxq = curq;

            fm = i + 1;

            fz = i;

        }

    }

    int maxgcd = __gcd(a[fm], a[fz]);

    if(maxgcd == 0)

        maxgcd = 1;

    cout << a[fm] / maxgcd << "/" << a[fz] / maxgcd << endl;

    return 0;

}

我草 居然真可以这样写

不过思路应该是这样

要找到最小的公比 因为整个数列是等比的 如果公比大了 就不能让所有的数满足等比性质

所以要找到一个能让所有数都满足的公比

把判断改成乘法 避免精度丢失

image-03e16b9e

没必要存储maxq 只需要一直迭代能获得最大公比的分母和分子就行了

后面就和前面一样了 去求最大公因数 做一个约分

#include<bits/stdc++.h>

using namespace std;

const int N=110;

long long a[N];

int main() {

    int n; cin >> n;

    for(int i = 0; i < n; i++)

        cin >> a[i];

    sort(a, a + n);

    long long fz = 0, fm = 1;

    for(int i = 0; i + 1 < n; i++) {

        if(fz * a[i + 1] < fm * a[i] && a[i] != a[i+1]) {

            fz = a[i];

            fm = a[i + 1];

        }

    }

    long long maxgcd = __gcd(fz, fm);

    cout << fm / maxgcd << "/" << fz / maxgcd << endl;

    return 0;

}
image-76520913

就……这样……过了?

image-9c7ea7fc

就……这样……ak了???

emmm 这道题确实是 我自己都不知道为什么就可以这样写 真就是蒙 这就是贪心吗

经验教训呢 是 考试时有时间多的话 贪心问题有想法就想办法完善一下 因为一开始的试试看的方案很多漏洞

把这些漏洞补全 考虑周到些 说不定就ac了呢 hh

另外 前面还有一道题 凑算式 也是用到了除法 对于这种除法的判断 都不能直接去做 他会自己取整 不可靠

要把除法转变成乘法进行判断

代码实现

#include<bits/stdc++.h>

using namespace std;

const int N=110;

long long a[N];

int main() {

    int n; cin >> n;

    for(int i = 0; i < n; i++)

        cin >> a[i];

    sort(a, a + n);

    long long fz = 0, fm = 1;

    for(int i = 0; i + 1 < n; i++) {

        if(fz * a[i + 1] < fm * a[i] && a[i] != a[i+1]) {

            fz = a[i];

            fm = a[i + 1];

        }

    }

    long long maxgcd = __gcd(fz, fm);

    cout << fm / maxgcd << "/" << fz / maxgcd << endl;

    return 0;

}

同类题型

视频讲解


⬅️ 6、交换瓶子 🏠 00-刷题理模型 ➡️ 第七届 c++ B组 省赛