日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

征战蓝桥 —— 2016年第七届 —— C/C++A组第10题——最大比例

發(fā)布時間:2024/5/6 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 征战蓝桥 —— 2016年第七届 —— C/C++A组第10题——最大比例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目

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

現(xiàn)在,我們隨機(jī)調(diào)查了一些獲獎?wù)叩莫劷饠?shù)。
請你據(jù)此推算可能的最大的等比值。

輸入格式:
第一行為數(shù)字 N (0<N<100),表示接下的一行包含N個正整數(shù)
第二行N個正整數(shù)Xi(Xi<1 000 000 000 000),用空格分開。每個整數(shù)表示調(diào)查到的某人的獎金數(shù)額

要求輸出:
一個形如A/B的分?jǐn)?shù),要求A、B互質(zhì)。表示可能的最大比例系數(shù)

測試數(shù)據(jù)保證了輸入格式正確,并且最大比例是存在的。

例如,輸入:
3
1250 200 32

程序應(yīng)該輸出:
25/4

再例如,輸入:
4
3125 32 32 200

程序應(yīng)該輸出:
5/2

再例如,輸入:
3
549755813888 524288 2

程序應(yīng)該輸出:
4/1

資源約定:
峰值內(nèi)存消耗 < 256M
CPU消耗 < 3000ms

請嚴(yán)格按要求輸出,不要畫蛇添足地打印類似:“請您輸入…” 的多余內(nèi)容。

所有代碼放在同一個源文件中,調(diào)試通過后,拷貝提交該源碼。

注意: main函數(shù)需要返回0
注意: 只使用ANSI C/ANSI C++ 標(biāo)準(zhǔn),不要調(diào)用依賴于編譯環(huán)境或操作系統(tǒng)的特殊函數(shù)。
注意: 所有依賴的函數(shù)必須明確地在源文件中 #include , 不能通過工程設(shè)置而省略常用頭文件。

提交時,注意選擇所期望的編譯器類型。

代碼

#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) {//底數(shù)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整數(shù)次方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;} //求兩兩比值,以分?jǐn)?shù)形式存儲,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).次方,作為基數(shù),如果這個基數(shù)也是其他比值的基數(shù)的話,該基數(shù)就是答案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次方,作為基數(shù),去嘗試LL base_y = extract(y, pow);//對y開pow次方,作為基數(shù),去嘗試if (base_x == -1 || base_y == -1)continue;//開不出,continue // 能開:就要去確認(rèn)所有比值的分子是fx的整數(shù)次方,所有比值的分母是fy的整數(shù)次方 //計px=getPow(xx,base_x),py=getPow(yy,base_y),要求必須是整數(shù)且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; }

總結(jié)

以上是生活随笔為你收集整理的征战蓝桥 —— 2016年第七届 —— C/C++A组第10题——最大比例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。