2016年第七届蓝桥杯C++B组G题
最大比例
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
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 3000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0 注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意:
所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
到这个地方为止我写了四份真题啦~40道题,加油!!!
这是一个gcd的拓展把。
今天一直在搞unity,啊哈哈哈老师又布置作业了。
我做好了初步的模型,名字叫做三月飞雪与光头强
别人都是六月飞雪,我们就一半一半好了,就叫做六月飞雪。
为啥有光头强呢,因为里面的人物模型有点像啊哈哈哈。
下次做好了再发出来哈。
看到这道题。迅速有了思路。就是分数卡到我了。要分别记录=-=
最后还是C++拯救了我=-=哇。。还是要认真学的啊=-=感觉上个学期的C++白学了qaq
这道题的思路就是先排序然后去重。=-=先开始用的set,发现不是很熟=-=就老实用了数组,然后unique去重了一下。
unique()函数值返回iterator,我们用的数组嘛,就直接返回的地址,然后直接减去首地址就是个数了。=-=这个跟lower_bound()差不多哈。
然后求一下相邻元素的比值=-=分数保存就可以啦。
然后把这些分数排序去重一下。求这些分数的“最大公约数”,就是他们的最大比值就可以啦。直接拿大的除以小的,然后跑一遍就可以获得"最大公约数"啦。输出=-=
这个地方用的是C++的流。=-=不是很熟。调试了三四次啊哈哈哈
听我这么一分析是不是简单了许多呢。
代码部分
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 105;
int n;
ll t[N];
ll gcd(ll a, ll b)
{
if (!b)
{
return a;
}
return gcd(b, a % b);
}
struct node
{
ll fi;
ll se;
node()
{
}
node(ll aa, ll bb)
{
if (!aa)
{
fi = 0;
se = 1;
}
else
{
ll t = gcd(aa, bb);
fi = aa / t;
se = bb / t;
}
}
bool operator <(const node &b) const {
return fi * b.se < se * b.fi;
}
bool operator ==(const node &b) const {
return !((*this) < b) && !(b < (*this));
}
node operator /(const node &b)
{
return node(fi * b.se, se * b.fi);
}
void print()
{
cout << fi << "/" << se << endl;
}
}a[N];
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
scanf ("%lld", &t[i]);
}
sort(t, t + n);
n = unique(t, t + n) - t;
for (int i = 0; i < n - 1; i++)
{
a[i] = node(t[i + 1], t[i]);
}
node ans(1e12, 1);
n--;
while (n > 1)
{
sort(a, a + n);
if (a[0] < ans)
{
ans = a[0];
}
n = unique(a, a + n) - a;
for (int i = 0; i < n - 1; i++)
{
a[i] = a[i + 1] / a[i];
}
n--;
}
if (a[0] < ans)
{
ans = a[0];
}
ans.print();
return 0;
}