2016年第七届蓝桥杯C++B组G题

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;
}
发布了53 篇原创文章 · 获赞 2 · 访问量 1338

猜你喜欢

转载自blog.csdn.net/qq_44624316/article/details/104660936