计蒜客信息学3月普及组模拟赛

A. 断幺九 题目链接

  • 分值:100
  • 时间限制:1000ms
  • 测试点数目:10

B. 锈湖  题目链接

  • 分值:100
  • 时间限制:2000ms
  • 测试点数目:10

C. 图    题目链接

  • 分值:100
  • 时间限制:1000ms
  • 测试点数目:10

D. 体育课  题目链接

  • 分值:100
  • 时间限制:1000ms
  • 测试点数目:20


 下面步入正题

A. 断幺九

解题思路:

  这个题其实困难在于读题,总结一下就是只要这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.锈湖

 

解题思路:

  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月普及组模拟赛题解三、四题

 

原文地址:https://www.cnblogs.com/yinyuqin/p/10584524.html