计蒜客信息学3月普及组模拟赛
- 分值: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 }
B.锈湖
解题思路:
-
枚举所选的两把钥匙,计算他们的最大公约数。可以通过暴力枚举求两个数的最大公约数。 时间复杂度 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 }
如果不懂,强烈推荐大家看我的另一篇博客:洛谷 P1414 又是毕业季II