ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

2025级SYUCT-ACM新生第四次训练 题解

2025级SYUCT-ACM新生第四次训练 题解

目录

  • A.Hello World
  • B.字符数数
  • C.笨小明
  • D.最小字符串
  • E.鹦鹉学舌
  • F.鹦鹉学画、G.崩铁启动
  • H.字符串大小比较
  • I.小明的环形字符串
  • J.找整数
  • K.Your Ride Is Here
  • L.小B的传说
  • M.流星
  • N.龙卷风摧毁停车场
  • O. 龙卷风摧毁停车场(升级版)
  • P.最小Move串

A.Hello World

按题意输出即可。

#include<stdio.h>intmain(){chars[25];scanf("%s",s);printf("Hello %s!\n",s);return0;}

B.字符数数

输入n,然后输入字符串s,用四个变量分别计数,遍历一遍字符串,判断每个字符是什么,给对应的变量+1即可

输入字符串gets(s),就要用getchar()吃掉换行,因为gets()什么都读;
如果用scanf("%s", s),就不用getchar,因为scanf会自动过滤掉空格和换行

ACcode

#include<stdio.h>#include<string.h>intmain(){intn;// 字符串长度nchars[1010];//字符串sintcnt1=0,cnt2=0,cnt3=0,cnt4=0;//分别记录四个数量scanf("%d",&n);getchar();//getchar()吃掉scanf剩下的换行gets(s);//输入sfor(inti=0;i<n;i++){if(s[i]>='a'&&s[i]<='z')cnt1++;//小写字母elseif(s[i]>='A'&&s[i]<='Z')cnt2++;//大写字母elseif(s[i]>='0'&&s[i]<='9')cnt3++;//数字elsecnt4++;//其他字符}printf("%d %d %d %d",cnt1,cnt2,cnt3,cnt4);return0;}

C.笨小明

输入字符串s,用一个cnt数组来存单词中的每个字母出现的次数,遍历一遍每个字符,给对应的字母+1,(cnt[s[i] - 'a']++;),通过-‘a’将a~z映射到cnt数组的0~25的位置上,同时每次更新minn和maxn的值,最后判断质数即可

注意:0和1也不是质数,要特判一下

注意:这题更新maxn和minn的值时要注意,题中要的是单词中字母的出现次数,所以minn最小也要是1,不能直接从'a'遍历到‘z'来更新,因为如果有单词中没出现过的字母,minn就被更新成0了,答案就错了

ACcode

#include<stdio.h>#include<string.h>intcnt[26];//cnt数组,用来统计a~z在单词中出现的次数,a对应0,b对应1 ... z对应25intmain(){chars[105];intmaxn=0,minn=101;//初始化maxn为一个极小值,maxn为一个极大值gets(s);//输入sintn=strlen(s);//s的长度for(inti=0;i<n;i++){cnt[s[i]-'a']++;//给cnt数组对应的位置+1, a对应0,b对应1 ... z对应25intt=cnt[s[i]-'a'];if(t>maxn)maxn=t;//如果比最大值大,就更新最大值if(t<minn)minn=t;//如果比最小值小,就更新最小值}intx=maxn-minn;intflag=0;//判断质数if(x==1||x==0)flag=1;//特判一下,0和1也不是质数for(inti=2;i*i<=x;i++){if(x%i==0){flag=1;break;}}if(flag==0)printf("Lucky Word\n%d",x);//是质数elseprintf("No Answer\n0");//不是质数return0;}

D.最小字符串

这题我们可以贪心地删掉第一个满足s[i]>s[i+1]的字符s[i],就可以让字符串最小,要注意:如果字符串长度是1就不能删了,如果这个时候还删,就全删没了,就只剩下空字符,他就不算字符串了

证明:
用反证法,如果我们不删除这个位置,而是删除其他位置的字符,那么会使得较大的字符保留在字符串中,导致字典序变大。因此,删除第一个满足s[i]>s[i+1]的字符s[i]的字符是使得字符串最小的唯一方法。

代码实现:首先要找到第一个满足s[i]>s[i+1]的位置。用while循环,从t=0开始找,如果s[t]<=s[t+1]就继续判断下一个位置,直到第一次出现s[t]>s[t+1],循环终止,这时下标为t的字符就是你要删的字符,只需for循环从0~n-1遍历字符串s的每一个字符并输出,当遍历到t时直接跳过就行了

ACcode

#include<stdio.h>#include<string.h>intmain(){intn;chars[200005];scanf("%d",&n);getchar();//getchar()吃掉scanf留在缓冲区中的换行gets(s);if(n==1){//特判只有1个字符的情况puts(s);//直接输出return0;//直接提前结束程序,防止多输出了什么东西}intt=0;//从0开始判断,用来记录要删除的字符的下标while(t<n&&s[t]<=s[t+1]){//从第一个字符开始判断,满足条件就继续判断下一个,直到遇到第一个不满足的,循环终止。这时的t就是我们想删掉的那个字符的下标t++;//t移到下一个位置,继续判断}for(inti=0;i<n;i++){if(i!=t)printf("%c",s[i]);//不输出就相当于删除,到t就跳过,别的一个一个输出}return0;}

E.鹦鹉学舌

输入一个字符串,然后原样输出

ACcode

#include<stdio.h>intmain(){chars[200005];gets(s);//输入puts(s);//输出return0;}

F.鹦鹉学画、G.崩铁启动

输入n个字符串,原样输出

ACcode

#include<stdio.h>intmain(){intn;
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进