2016藍橋杯A組第十題 最大比例

最近準備藍橋杯比賽,看了去年藍橋杯A組初賽的試題,最後一題花費了很多時間才找到思路。本人也是剛學習算法,很多都不懂,只好班門弄斧,各位大牛見笑了。

直接上題:

X星球的某個大獎賽設了M級獎勵。每個級別的獎金是一個正整數。
並且,相鄰的兩個級別間的比例是個固定值。
也就是說:所有級別的獎金數構成了一個等比數列。比如:
16,24,36,54
其等比值爲:3/2

現在,我們隨機調查了一些獲獎者的獎金數。
請你據此推算可能的最大的等比值。

輸入格式:
第一行爲數字N,表示接下的一行包含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 , 不能通過工程設置而省略常用頭文件。

我的思路其實很簡單,先對輸入數據排序,然後依次用後一個除以前一個得到比例,當然這個比例要用結構體表示(分子,分母),將所有比例保存下來,對比例排序,然後用後一個比例除以前一個比例,更新後一個比例爲所求值,所有比例遍歷完,對比例排序,按照相同的操作循環,直到前面所有比例爲1:1,最後一個比例即爲所求比例;說起來有點抽象,舉個例子,假如所求比例爲t,比例數組 1 ,t^2,t,t^6,t^3;排序之後 1,t^2,t^3,t^6,相鄰比例相除:1,t^2,t,t^5;排序:1,t,t^2,t^5;比例相除:1,t,t,t^4;再相除:1,t,1,t^4....

最終會得到1,1,1,t;

代碼如下:

#include<iostream>  
#include<algorithm>
using namespace std;
long long gcd(long long a, long long b)
{
	return a%b ? gcd(b, a%b) : b;
}
struct bili
{
	int fenzi;
	int fenmu;
	bool operator<(bili&t)const
	{
		return fenzi*1.0 / fenmu < t.fenzi*1.0 / t.fenmu;
	}
}n[100];
int main()
{
	long long a[100];
	int count, i;
	cin >> count;
	for (int i = 0;i < count;i++)
		cin >> a[i];
	sort(a, a +count);
	for (i = count - 1;i > 0;i--)
	{
		long long t = gcd(a[i], a[i - 1]);
		n[i - 1].fenzi = a[i] / t, n[i - 1].fenmu = a[i - 1] / t;
	}
	sort(n, n + count - 1);
	while (1) {
		for (i = 0;i < count - 2;i++)
		{
			int t = gcd(n[i + 1].fenzi *n[i].fenmu, n[i + 1].fenmu*n[i].fenzi);
			n[i + 1].fenzi = n[i + 1].fenzi *n[i].fenmu / t;
			n[i + 1].fenmu = n[i + 1].fenmu *n[i].fenzi / t;
		}
		sort(n, n + count - 1);
		for (i = 0; n[i].fenzi == 1;i++);
		if (i == count - 2)
			break;
	}
	cout << n[count - 2].fenzi << '/' << n[count - 2].fenmu;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章