最大比例(蓝桥杯)

最大比例

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

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

输入格式:
第一行为数字 N (0<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

扫描二维码关注公众号,回复: 11975277 查看本文章

程序应该输出:
4/1

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

解析:另补,,,

//第一种
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 110;

int n;
LL a[N], b[N], x[N];

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

LL gcd_sub(LL a,LL b)//辗转相减的另一种使用
{
    
    
    if(a==b) return a; //这里一定会 出现这种情况的 因为我们的b和a是倍数关系
    if(a>b) return gcd_sub(b,a/b);//我们保证a>b
    else return gcd_sub(b,a); 
}

int main()
{
    
    
    cin >> n;
    for (int i = 0; i < n; i ++ ) cin >> x[i];

    sort(x, x + n);
    int cnt = 0;
    for (int i = 1; i < n; i ++ )
        if (x[i] != x[i - 1])
        {
    
    
            LL d = gcd(x[i], x[i - 1]);
            a[cnt] = x[i] / d;
            b[cnt] = x[i - 1] / d;
            cnt ++ ;
        }


    LL up = a[0], down = b[0];
    for (int i = 1; i < cnt; i ++ )
    {
    
    
        up = gcd_sub(up, a[i]);
        down = gcd_sub(down, b[i]);
    }
    
    cout << up << '/' << down << endl;

    return 0;
}


//第二种
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<map>  
#include<set>
using namespace std;
 
long long gcd(long long a,long long b)//求最大公约数,怕数值越出,所以用long long
{
    
    
	long long t;
	while(t=a%b)
	{
    
    
		a=b;
		b=t;
	}
	return b;
}
int main()
{
    
    
	long long a[100]={
    
    0},p1[100]={
    
    0},p2[100]={
    
    0},t,g,t1,t2;
	int n,i,j,k;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%lld",&a[i]);//处理输入
	sort(a,a+n); //排序
	j=1;
	for(i=1;i<n;i++) //去重 
	{
    
    
		if(a[i]!=a[i-1])
			a[j++]=a[i];
	}//这里也可以考虑用set集合去重
	n=j;
	if(n==1) //只有一个数 
		printf("1/1\n");
	else if(n==2) //有两个数 
	{
    
    	
		g=gcd(a[n-1],a[n-2]);
		printf("%lld/%lld\n",a[n-1]/g,a[n-2]/g);
	}
	else if(n>2)
	{
    
    
		k=0;
		for(i=1;i<n;i++) //分别求出后一项和前一项的比值 
		{
    
    
			g=gcd(a[i],a[i-1]);
			p1[k]=a[i]/g;
			p2[k]=a[i-1]/g;
			k++;
			//printf("%d %d %d\n", k - 1, p1[k - 1], p2[k - 1]);
		}
		for(i=0;i<k;i++) //找出最小公比 
		{
    
    
			for(j=i+1;j<k;j++)
			{
    
    
				if(p1[i]*p2[j]>p1[j]*p2[i]) //p1[i]/p2[i]比p1[j]/p2[j]大  p1[i]/p2[i]除p1[j]/p2[j]
				{
    
    
					t1=p1[i]/p1[j];
					t2=p2[i]/p2[j];
				}
				else if(p1[i]*p2[j]<p1[j]*p2[i])
				{
    
    
					t1=p1[j]/p1[i];
					t2=p2[j]/p2[i];
				}
				else if(p1[i]*p2[j]==p1[j]*p2[i])
				{
    
    
					t1=p1[i];
 					t2=p2[i];
				}
			}
		}
		g=gcd(t1,t2);
		printf("%lld/%lld\n",t1/g,t2/g);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45772236/article/details/108368266