最大比例,蓝桥杯,2016初赛

题目链接

添加链接描述
(注:这里是多组测试用例,输入输出格式有一点区别)

解题思路

先排序(从小到大)
每一项ai都可写作a0*q^m的形式,各项相除便可得到最大比例(不一定是公比q,可能是q的n次幂)的若干次幂,且这些幂指数的最大公约数为1(可反证,若不为1,设其gcd=m,则存在更大的最大比例q的m次方),所以将这些项各项相除(用大的除以小的),用set去重,到最后只剩一项即为最大比例。
特判一下所有数相同,最大比例为1/1的情况。
代码如下:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;


ll gcd(ll a,ll b){
    ll c;
    while(c = a%b){
        a = b;
        b = c;
    }
    return b;
}

struct fs{
    ll fz,fm;
    fs(){}
    fs(ll f1,ll f2){
        ll c = gcd(f1,f2);
        fz = f1/c;
        fm = f2/c;
    }
    bool operator<(const fs& f)const{
        return fz*1.0/fm < f.fz*1.0/f.fm;
    }
};

void robot(fs& f1,fs& f2){
    f2.fz /= f1.fz;
    f2.fm /= f1.fm;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n;
    ll num;
    set<ll> s;
    vector<ll> v;
    vector<fs> a;
    for(int i = 0; i < n; ++i)
    {
        cin >> num;
        s.insert(num);
    }
    if(s.size()==1)
    {
        cout << "1/1" << endl;
        return 0;
    }
    v.assign(s.begin(),s.end());
    sort(v.begin(),v.end());
    set<fs> ss;
    for(int j = 0; j < v.size()-1 ; ++j)
    {
        ss.insert(fs(v[j+1],v[j]));
    }
    a.assign(ss.begin(),ss.end());
    sort(a.begin(),a.end());
    if(a.size()==1)
    {
        cout << a[0].fz << "/" << a[0].fm << endl;
        return 0;
    }
    sort(a.begin(),a.end());
    while(true)
    {
        ss.clear();
        for(int j = a.size()-1; j >= 1 ; --j)
        {
            robot(a[j-1],a[j]);
            ss.insert(a[j]);
        }
        ss.insert(a[0]);
        a.assign(ss.begin(),ss.end());
        sort(a.begin(),a.end());
        if(a.size() == 1 ){
            cout << "ans: " << a[0].fz << "/" << a[0].fm << endl;
            break;
        }
    }
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值