最大比例 公约数复用 【蓝桥真题】 (c++)

最大比例

X星球的某个大奖赛设了M级奖励。每个级别的奖金是一个正整数。
并且,相邻的两个级别间的比例是个固定值。
也就是说:所有级别的奖金数构成了一个等比数列。比如:
16,24,36,54
其等比值为:3/2

现在,我们随机调查了一些获奖者的奖金数。
请你据此推算可能的最大的等比值。

输入格式:
第一行为数字N(1<N<100),表示接下的一行包含N个正整数
第二行N个正整数Xi(Xi<1 000 000 000 000),用空格分开。每个整数表示调查到的某人的奖金数额

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

测试数据保证了输入格式正确,并且最大比例是存在的。

例如,
输入:
3
1250 200 32

程序应该输出:
25/4

再例如,输入:
4
3125 32 32 200

程序应该输出:
5/2

再例如,输入:
3
549755813888 524288 2

程序应该输出:
4/1

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 3000ms

我的思路

  • 本题解析:所有奖金数构成一个等比数列,那么随机选取的某部分奖金数之间满足(q)k的关系,q为公比,k为平方数。
  • 思路说明:
  1. 选取的部分奖金先排序,然后将部分奖金数中所有相邻两个数A、B(A>B)两两分组,并计算对应的商 S = A/B = (q)k
  2. 求得k,并将(q)k代入计算,若不存在所有的S均能由((q)k)n表示,则更新k(利用公约数的更新方式)
  3. 最后输出 S ,即为该算法的答案。
  • 公约数更新方式说明:求得的每对A/B = Si,i = 1 - (N-1),比如S1 = 625/16,S2 = 125/8,他们的最大比例这样求,625/16 = (5/2)4,125/8 = (5/2)3,所以他们的最大比例等于4、3的最大公约数,即(5/2)1

算法展示

个人实现(答案有误)

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;

LL N,in[101];//选取奖金总数 
LL mons[101],A,B,cnt;//mons:随机选取的奖金数,A:除数,B:被除数,cnt:辅助变量。 
struct Gc{
    LL A,B;
    Gc(LL _A,LL _B):A(_A),B(_B)//约分 
    {
        LL _gcd = maxDiv(A,B);//求最大公约数 
        A/=_gcd;
        B/=_gcd; 
    } 
    LL maxDiv(LL A,LL B)//最大公约数求解 
    {
        if(B==0)return A;
        return maxDiv(B,A%B); 
    }
}; 
vector<Gc> gcs;
 
 
//求最大公约数 
LL comDiv(LL a,LL b)//q对应的不同比率之间的最大公约数 
{
    if(b==0) return a;
    return comDiv(b,a%b); 
} 

//求公比平方数
LL  powcnt(LL a)
{
    for(LL i =40;i>0;i--)//求得公约数 
    {
        if(pow(gcs[0].A,1.0/i)!=-1)return i;
    }
    return -1;
}
int main() {
    //输入规模 
    cin>>N; 
    for(LL i = 0;i< N;i++)
    {
        cin>>in[i]; 
    }
    
    //升序排序 
    sort(in,in+N);  
    if(N==2)
    {
        cout<<in[1]<<"/"<<in[0]<<endl;
        return 0; 
    }    
    // 存入vector 
    for(LL i=0;i<N-1;i++)
    {
        if(in[i]!=in[i+1])gcs.push_back(Gc(in[i+1],in[i])); //添加每组数据 
    }
    
        
    //利用A,B最大公约数k求解 
    LL div = powcnt(gcs[0].A); 
    A = pow(gcs[0].A,1.0/div),B =pow(gcs[0].B,1.0/div);//记录最小数 
    
    for(LL j= 0;j<gcs.size();j++)//比较公比平方数 
    {   
        LL cnt = powcnt(gcs[j].A);
        LL com = comDiv(div,cnt);
        if(div>com)div = com;
        if(div==1)break;
    } 
    
    cout<<pow(A,div)<<"/"<<pow(B,div)<<endl;
    return 0;
}

网上借鉴:https://blog.csdn.net/lbperfect123/article/details/87305381

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#define MAX 100005
typedef long long ll;
using namespace std;
 
ll a[105];
 
struct node
{
    ll x,y;
}p[105];
bool cmp(node xx,node yy)
{
    return xx.x<yy.x;
}
int main()
{
    int n;
    cin>>n;
    for(int t=0;t<n;t++)
    {
        scanf("%lld",&a[t]);
    }
    sort(a,a+n);
    ll s1;
    ll x,y;
    int cnt=0;
    for(int t=n-1;t>=1;t--)
    {
        if(a[t]!=a[t-1])
        {
           s1=__gcd(a[t],a[t-1]);
           p[cnt].x=a[t]/s1;
           p[cnt++].y=a[t-1]/s1;  
        }
    }
    sort(p,p+cnt,cmp);
    ll minn=p[0].x;
    x=p[0].x;
    y=p[0].y;
    for(int t=0;t<cnt-1;t++)
    {
        if((p[t+1].x/p[t].x)<minn&&p[t+1].x/p[t].x!=1)
        {
            x=p[t+1].x/p[t].x;
            y=p[t+1].y/p[t].y;
        }
    }
    
    printf("%lld/%lld",x,y);
     
    return 0;
}


上文链接:交换瓶子 标记+归位【蓝桥真题】(c++)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351