征战蓝桥 —— 2016年第七届 —— C/C++A组第10题——最大比例
題目
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
程序應該輸出:
4/1
資源約定:
峰值內存消耗 < 256M
CPU消耗 < 3000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入…” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意: main函數需要返回0
注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴于編譯環境或操作系統的特殊函數。
注意: 所有依賴的函數必須明確地在源文件中 #include , 不能通過工程設置而省略常用頭文件。
提交時,注意選擇所期望的編譯器類型。
代碼
#include <stdio.h> #include <iostream> #include <vector> #include <map>using namespace std; typedef long long LL; int N; LL data[100];struct Ratio {LL x, y;Ratio(LL _x, LL _y) : x(_x), y(_y) {LL _gcd = gcd(x, y);x /= _gcd;y /= _gcd;}LL gcd(LL a, LL b) {if (b == 0)return a;return gcd(b, a % b);} };vector<Ratio> ratios; map<LL, map<LL,LL> > all_ex;//all_ex[x][pow]==x開pow次方 map<LL, map<LL,LL> > all_log;//all_log[x][y]==log_y_x,y的多少次方是x? void init(){for (int i = 2; i < 1e6; ++i) {//底數LL cur=(LL)i*i;int pow=2;while(cur<1e12){all_ex[cur][pow]=i;all_log[cur][i]=pow;pow++;cur*=i;}} } /*** 對x開pow次方* @param x* @param pow* @return*/ LL extract(LL x,LL pow){if(pow==1)return x;if(x==1)return 1;if(all_ex[x].find(pow)!=all_ex[x].end())//意味著x可以開pow整數次方return all_ex[x][pow];elsereturn -1; } /*** 求log_base_x* @param base* @param x* @return*/ LL log(LL base,LL x){if(base==x)return 1;if(all_log[x].find(base)!=all_log[x].end())//意味著可以得打一個k,base的k次方是xreturn all_log[x][base];return -1; } int main(int argc, const char *argv[]) {init();freopen("/Users/zhengwei/CLionProjects/lanqiaobei2019/2016_C_A/data10/in8.txt","r",stdin); //處理輸入scanf("%d", &N);for (int i = 0; i < N; ++i) {scanf("%lld", &data[i]);} //排序sort(data, data + N);//處理只有兩項的特殊情況if(N==2){Ratio ans = Ratio(data[1], data[0]);cout << ans.x << "/" << ans.y << endl;return 0;} //求兩兩比值,以分數形式存儲,vectorfor (int i = 0; i < N - 1; ++i) {if (data[i + 1] != data[i])//去重ratios.push_back(Ratio(data[i + 1], data[i]));} //對第一個比值開1~..pow(極限為40).次方,作為基數,如果這個基數也是其他比值的基數的話,該基數就是答案for (int pow = 1; pow <= 40; ++pow) {Ratio ra0 = ratios[0];LL x = ra0.x;LL y = ra0.y;LL base_x = extract(x, pow);//對x開pow次方,作為基數,去嘗試LL base_y = extract(y, pow);//對y開pow次方,作為基數,去嘗試if (base_x == -1 || base_y == -1)continue;//開不出,continue // 能開:就要去確認所有比值的分子是fx的整數次方,所有比值的分母是fy的整數次方 //計px=getPow(xx,base_x),py=getPow(yy,base_y),要求必須是整數且px==pybool all_match = true;for (int i = 1; i < ratios.size(); ++i) {LL xx = ratios[i].x;LL yy = ratios[i].y;LL log_x = log(base_x,xx);LL log_y = log(base_y,yy);if(base_y==1&&yy==1)log_y=log_x;if (log_x == -1 || log_y == -1 || log_x != log_y) {all_match = false;break;}}if (all_match) {Ratio ans = Ratio(base_x, base_y);cout << ans.x << "/" << ans.y << endl;return 0;}}return 0; }總結
以上是生活随笔為你收集整理的征战蓝桥 —— 2016年第七届 —— C/C++A组第10题——最大比例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 征战蓝桥 —— 2016年第七届 ——
- 下一篇: 2016年第七届蓝桥杯 - 省赛 - C