計蒜客信息學3月普及組模擬賽
A. 斷幺九 題目鏈接
- 分值:100
- 時間限制:1000ms
- 測試點數目:10
B. 銹湖 題目鏈接
- 分值:100
- 時間限制:2000ms
- 測試點數目:10
C. 圖 題目鏈接
- 分值:100
- 時間限制:1000ms
- 測試點數目:10
D. 體育課 題目鏈接
- 分值:100
- 時間限制:1000ms
- 測試點數目:20
下面步入正題
A. 斷幺九
今晚,hzj 一如既往地打開雀魂,開始愉快的打麻將。
第一把四人東,前三局都荒牌了,hzj 決定在第四局絕地反擊。
終於,hzj 等到了上家放銃,但是由於他打的太過激烈,大腦超速運轉,已經無法算清自己的牌了。
現在他只想知道自己的牌是不是斷幺九,於是他決定將這個艱巨的任務交給你。
斷幺九就是指牌裏面沒有一筒(Ipin)、九筒(Chupin)、一索(Isou)、九索(Chusou)、一萬(Iwan)、九萬(Chuwan)、東(Ton)、南(Nan)、西(Sha)、北(Pei)、白(Haku)、發(Hatsu)、中(Chun)。
輸入格式
輸入共十四行,每行一個字符串,代表 hzj 的牌。
輸出格式
一行一個字符串,如果 hzj 的牌是斷幺九,輸出"Rong,Duan Yao Jiu,1000 Dian"
,否則輸出"Gong Fu Zai Gao,Ye Pa Duan Yao"
。
數據範圍
本題共有 10個測試點,每個測試點 10分。
對於第一個測試點,所有的牌都是筒子;
對於第二個測試點,所有的牌都是索子;
對於第三個測試點,所有的牌都是萬子;
對於剩下的七個測試點,無特殊限制。
保證數據合法且每行的牌的字符串長度不會超過 100,但是你並不需要知道其他牌的名稱。
輸出時每行末尾的多余空格,不影響答案正確性
樣例輸入
Ton
Ton
Ton
Nan
Nan
Nan
Sha
Sha
Sha
Pei
Pei
Pei
Hatsu
Hatsu
樣例輸出
Gong Fu Zai Gao,Ye Pa Duan Yao
解題思路:
這個題其實困難在於讀題,總結一下就是只要這14行沒有一筒(Ipin)、九筒(Chupin)、一索(Isou)、九索(Chusou)、一萬(Iwan)、九萬(Chuwan)、東(Ton)、南(Nan)、西(Sha)、北(Pei)、白(Haku)、發(Hatsu)、中(Chun),那麽這副牌就是斷幺九牌。換句話說,只要有一個上述牌,它就不是斷幺九牌。代碼編輯難度是很簡單的。
1 #include<iostream> 2 using namespace std; 3 string s; 4 int main(){ 5 for(int i=1;i<=14;i++){ 6 cin>>s; 7 if(s=="Ipin"||s=="Chupin"||s=="Isou"||s=="Chusou"||s=="Iwan"||s=="Chuwan"||s=="Ton"||s=="Nan"||s=="Sha"||s=="Pei"||s=="Haku"||s=="Hatsu"||s=="Chun") 8 { 9 cout<<"Gong Fu Zai Gao,Ye Pa Duan Yao"; 10 return 0; 11 } 12 } 13 cout<<"Rong,Duan Yao Jiu,1000 Dian"; 14 return 0; 15 }AC代碼
B.銹湖
你在玩銹湖。
你卡關了。
你面前有 n 把鑰匙,第 i把鑰匙的上面寫著線索數字 ai?。
你要在其中找到兩把鑰匙,使得他們線索數字的最大公約數最大。
輸入格式
第一行一個正整數 n,第二行 n個正整數 ai?。
輸出格式
一行一個整數,表示最大的最大公約數。
數據範圍
對於 20% 的數據,n≤500, ai≤500;
對於 30%的數據,n≤4000;
對於 50%的數據,n≤100000,ai≤300000;
對於 100%的數據,n≤5000000,ai≤5000000。
輸出時每行末尾的多余空格,不影響答案正確性
樣例輸入1
3 3 6 8
樣例輸出1
3
樣例輸入2
點擊下載樣例輸入文件樣例輸出2
點擊下載樣例輸出文件解題思路:
-
枚舉所選的兩把鑰匙,計算他們的最大公約數。可以通過暴力枚舉求兩個數的最大公約數。 時間復雜度 O(amaxn2 ),其中 amax 指最大的 ai。
-
枚舉所選的兩把鑰匙,計算他們的最大公約數(歐幾裏得算法)。 時間復雜度 O(n2 log n)。
-
設 m 為最大的 ai。最後的答案一定是那兩把鑰匙的約數。那麽對每個 ai,將其約數全部扔到一個桶裏,如果一個數出現兩次,那麽可以成為答案。時間復雜度 O(n√m)。
- 正解:考慮每個x 能成為答案,當且僅當他的倍數在鑰匙中出現了兩次以上。對於每個x 枚舉它的倍數並計數就可判斷了。時間復雜度 O(n log n)。
1 #include <cstdio> 2 #include <algorithm> 3 #include<iostream> 4 using namespace std; 5 int vis[5000000],num[5000000]; 6 int main() { 7 int n, in, mmax = 0; 8 scanf("%d", &n); 9 for (int i = 1; i <= n; ++i) { 10 scanf("%d", &in); 11 ++vis[in]; 12 mmax = max(mmax, in); 13 } 14 for (int i = 1; i <= mmax; ++i) 15 for (int j = i; j <= mmax; j += i) 16 num[i] += vis[j]; 17 for(int i=mmax;i>=1;i--) if(num[i]>=2){ 18 cout<<i<<endl; 19 return 0; 20 } 21 }AC代碼
如果不懂,強烈推薦大家看我的另一篇博客:洛谷 P1414 又是畢業季II
至於C、D兩題:
本蒟蒻也不會啊,只能先附上題解:2019年3月普及組模擬賽題解三、四題
計蒜客信息學3月普及組模擬賽