题目列表:
2016年:最大比例
2017年:承压计算,包子凑数
2019年:等差数列
2020年:合并检测
2021年:直线
2022年模拟赛:约数
2022年第一次模拟赛:奇不动排列,人字排列
2022年第二次模拟赛:半递增序列
1.最大比例
X星球的某个大奖赛设了M级奖励。每个级别的奖金是一个正整数。
并且,相邻的两个级别间的比例是个固定值。
也就是说:所有级别的奖金数构成了一个等比数列。比如:
16,24,36,54
其等比值为:3/2
现在,我们随机调查了一些获奖者的奖金数。
请你据此推算可能的最大的等比值。
输入格式:
第一行为数字N(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
分析:
1.我们先分析两个例子:
32 200 1250
他们之间的比例是:
他们之间的最大比例是
32 200 3125
他们之间的比例是:
25和125同是5的次方,4和8同是2的次方
所以他们之间的最大比例是
代码:
下面先介绍一个类欧几里得算法:
当知道两个数 a,b。 a=p^i b=p^j 那么我们怎么求这个p呢?
long long ggcd(long long a,long long b){
if(a==b){//如果出现例1的情况,两个相同的分子和分母,25,25就立即返回,而不会返回5
return a;
}
else{
return ggcd(min(b/a,a),max(b/a,a));
}
}
(只过了75%,博主实在是找不到问题所在,如果你发现了,请在评论区告诉我哦^^)
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX_N = 110;
int N;
long long a[MAX_N],z[MAX_N],m[MAX_N];
long long gcd(long long a,long long b){
return b? gcd(b,a%b) : a;
}
long long ggcd(long long a,long long b){
if(a == b){
return a;
}
return ggcd(min(b/a,a),max(b/a,a));
}
int main(){
cin >> N;
for(int i = 0;i < N;i++){
cin >> a[i];
}
sort(a,a+N);
int j = 0;
for(int i = 0;i < N-1;i++){
if(a[i]!=a[i+1]){
long long k = gcd(a[i],a[i+1]);
z[j] = a[i+1]/k;
m[j++] = a[i]/k;
}
}
long long zm = z[0],mm = m[0];
for(int i = 1;i < j;i++){
zm = ggcd(zm,z[i]);
mm = ggcd(mm,m[i]);
}
cout << zm << "/" << mm;
return 0;
}
2.承压计算
X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。
每块金属原料的外形、尺寸完全一致,但重量不同。
金属材料被严格地堆放成金字塔形。
7
5 8
7 8 8