A题
题目大意:数 acm 出现的次数,语文题
思路: ~~~
经常有人问Q学长,ACM是什么,有什么意义。
每当这个时候,Q学长就会说,大概是一个逼格很高的比赛吧。
ACM国际大学生程序设计竞赛(英文全称:ACM International Collegiate Programming Contest(ACM-ICPC或ICPC)是由国际计算机学会(ACM)主办的,一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛。经过近30多年的发展,ACM国际大学生程序设计竞赛已经发展成为最具影响力的大学生计算机竞赛。赛事目前由IBM公司赞助。
-来自百度百科
在一次一次的比赛中,却发现自己已经逐渐习惯了这种氛围,ACM这一路走来,其中艰辛也只有自己知道,有过快乐和失望,也有期待和迷茫。从一开始奢望ACM带给我什么,到最后走的时候却发现自己更喜欢的是这过程。
我记得当年我做的第一题竞赛题,其中就有一句ACM就像是一个游戏,如今看来,似乎也是。在ACMer心里,ACM是一场游戏,没有爱过的人,不会懂。
如今将此题献给你们,希望未来的路上你们可以风雨无阻,努力去追寻自己喜欢的事物。所谓梦想,不是一开始的勇不可当,而是永不停息的疯狂。
本题作为签到题,无输入,请输出题目描述中ACM出现的次数,以换行结束。
ac代码
#include <stdio.h>
int main(){
printf("12\n");
return 0;
}
B题
题目大意:判断两个数是否相等
思路:分支结构 if-else即可,注意两个感叹号不一样
ac代码:
#include <stdio.h>
#include <stdlib.h>
int main(){
int x,y;
scanf("%d%d",&x,&y);
if(x==y) printf("Tacit!\n");
else printf("No Tacit!\n");
return 0;
}
C题
题目大意:计算 1 到 n 中,含2的数字有多少个
思路:循环判断即可
ac代码
#include <stdio.h>
#include <stdlib.h>
int main(){
int n;
scanf("%d",&n);
int res = 0;
for(int i = 1; i <= n; i++){
int j = i;
while(j){
if(j % 10 == 2){
res++;
break;
}
j /= 10;
}
}
printf("%d\n", res);
return 0;
}
D题
题目大意:输出一个数字的对应的拼音
思路:字符串模拟就好(解法很多,可以多研究研究)
字符串模拟
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char s[1000];
scanf("%s", s); // 输入字符串
int len = strlen(s); // 计算字符串长度
for(int i = 0; i < len; i++){ // 依次输出
if(s[i] == '-') printf("fu ");
else if(s[i] == '0') printf("ling ");
else if(s[i] == '1') printf("yi ");
else if(s[i] == '2') printf("er ");
else if(s[i] == '3') printf("san ");
else if(s[i] == '4') printf("si ");
else if(s[i] == '5') printf("wu ");
else if(s[i] == '6') printf("liu ");
else if(s[i] == '7') printf("qi ");
else if(s[i] == '8') printf("ba ");
else if(s[i] == '9') printf("jiu ");
}
return 0;
}
E题
题目大意:求 N!的位数
思路:因为 N 比较大,通过求N!的对数来解决
第一点: 102 < 999 = 102.9… < 103
第二点: log10(1) + log10(2) + … + log10(n-1) + log10(n) = lon10( N! )
第三点: 0! = 1
ac代码
#include<stdio.h>
#include<math.h>
int main(){
int n;
double len=1;
scanf("%d", &n);
for(int i = 1; i <= n; i++){
len += log10(i);
}
printf("%d", (int)len);
return 0;
}
F题
题目大意:判断两个人是否在是朋友
思路:并查集裸题
第一点:我们可以认为,是好朋友的几个人在一个朋友圈里边,并且默认一个朋友圈有一个老大,刚开始的时候,每个人都在只有自己的朋友圈里,并且自己是这个朋友圈的老大。
第二点:当两个人成为朋友的时候,我们就可以认为,一个人 a 成为了另一个人 b 的老大,这样 b 小弟也都成为了 a 的小弟。
第三点:查询时,如果两个人有相同的老大,他们就是好朋友,否则就不是。
ac代码
#include<stdio.h>
#include<math.h>
const int maxn = 1e6 + 5;
int f[maxn]; // 记录每个人的老大是谁,我们可以认为每个集合里边都有一个老大
int find(int x){ // 寻找 x 的老大是谁,当 f[x] = x 的时候,他就是这个集合的老大
if(x == f[x]) return x;
else return f[x] = find(f[x]); // 当 f[x] != x 的时候,说明他的老大是 f[x],再去看一下 f[x] 对应的人有没有老大
} // 这里要注意,如果 f[x] 有老大,说明 f[x] 的老大同样是 x 的老大
void join(int x, int y){ // 合并 x 和 y
int fx = find(x); // 找 x 的老大
int fy = find(y); // 找 y 的老大
if(fx != fy) f[fx] = fy; // 如果他们的老大不同,就让 y 的老大成为 x 的老大
}
int main(){
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) f[i] = i; // 初始化,默认每个人都是自己的老大
int op, a, b;
for(int i = 1; i <= m; i++){
scanf("%d%d%d",&op, &a, &b);
if(op == 1){
join(a, b);
}
else{
if(find(a) == find(b)) printf("Y\n"); //相同的老大就输出 Y
else printf("N\n");
}
}
return 0;
}
end
第一次组织比赛,出了好多锅,下一次一定不会了