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

目录

  • 0001.字符数数
  • 0002.笨小明
  • 0003.最小字符串
  • 0004.鹦鹉学舌
  • 0005.鹦鹉学画
  • 0006.字符串大小比较
  • 0007.小明的环形字符串
  • 0008.找整数
  • 0009.流星
  • 0010.Your Ride Is Here
  • 0011.龙卷风摧毁停车场
  • 0012. 龙卷风摧毁停车场(升级版)
  • 0013.最小Move串

0001.字符数数

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

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

ACcode

#include
#include
int main(){
   
	int n;  // 字符串长度n
	char s[1010]; //字符串s
	int cnt1 = 0, cnt2 = 0, cnt3 = 0, cnt4 = 0; //分别记录四个数量
	scanf("%d", &n); 
	getchar();  //getchar()吃掉scanf剩下的换行
	gets(s); //输入s
	for(int i = 0; i < n; i++){
   
		if(s[i] >= 'a' && s[i] <= 'z') cnt1++;  //小写字母
		else if(s[i] >= 'A' && s[i] <= 'Z') cnt2++; //大写字母
		else if(s[i] >= '0' && s[i] <= '9') cnt3++;  //数字
		else cnt4++;  //其他字符
	}
	printf("%d %d %d %d", cnt1, cnt2, cnt3, cnt4);
	return 0;
}

0002.笨小明

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

注意:01也不是质数,要特判一下

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

ACcode

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

0003.最小字符串

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

0004.鹦鹉学舌

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

ACcode

#include
int main(){
   
	char s[200005];
	gets(s); //输入
	puts(s); //输出
	return 0;
}

0005.鹦鹉学画

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

ACcode

#include
int main(){
   
	int n;
	

你可能感兴趣的:(算法)