1. 程式人生 > >計蒜客信息學3月普及組模擬賽

計蒜客信息學3月普及組模擬賽

判斷 code 鏈接 cdc pin 技術 uwa names -418

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≤100000ai≤300000

對於 100%的數據,n≤5000000ai≤5000000

輸出時每行末尾的多余空格,不影響答案正確性

樣例輸入1

3
3 6 8

樣例輸出1

3

樣例輸入2

點擊下載樣例輸入文件

樣例輸出2

點擊下載樣例輸出文件

解題思路:

  1. 枚舉所選的兩把鑰匙,計算他們的最大公約數。可以通過暴力枚舉求兩個數的最大公約數。 時間復雜度 O(amaxn2 ),其中 amax 指最大的 ai

  2. 枚舉所選的兩把鑰匙,計算他們的最大公約數(歐幾裏得算法)。 時間復雜度 O(n2 log n)。

  3. 設 m 為最大的 ai。最後的答案一定是那兩把鑰匙的約數。那麽對每個 ai,將其約數全部扔到一個桶裏,如果一個數出現兩次,那麽可以成為答案。時間復雜度 O(n√m)。

  4. 正解:考慮每個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月普及組模擬賽