首页 > 其他分享 >洛谷 P1321 单词覆盖还原

洛谷 P1321 单词覆盖还原

时间:2024-11-10 19:14:41浏览次数:3  
标签:boy 洛谷 int 单词 P1321 字符串 girl include

一、题目描述

我有一个长度为 l 的字符串,最开始时,这个字符串由 l 个句号(.)组成。

我在这个字符串中,将多次把 boy 或者 girl 两单词,依次贴到这个字符串中。

后贴上单词,会覆盖之前贴上的单词,或者覆盖句号。最终,每个单词至少有一个字符没有被覆盖。

请问,一共贴有几个 boy 几个 girl

二、输入格式

一行被反复贴有 boy 和 girl 两单词的字符串。

三、输出格式

两行,两个整数。第一行为 boy 的个数,第二行为 girl 的个数。

四、输入输出样例

输入

......boyogirlyy......girl.......

输出 

4
2

五、算法思想

这道题我使用了 Switch...case 语句,有点想复杂了,看了各位大神的题解,才醍醐灌顶,恍然大悟~~

先说一下我的思路:

1、用一维字符数组记录字符串,利用 For 循环逐个比较;

2、For 循环中嵌套了 Switch...case 语句进行判断。判断写得有点复杂了,

3、boy 有 'boy'、'bo'、'oy'、'b'、'o'、'y' 多种情况

girl 有 'girl'、'gir'、'irl'、'gi'、'ir'、'rl'、'g'、'i'、'r'、'l' 多种情况

代码

#include<stdio.h>
#include<string.h>

int main(){
	char s[255];
	scanf("%s",s);
	
	int l = strlen(s);
	int boy=0,b=0;//boy记录boy出现次数,b记录在'b'哪个位置出现 
	int girl=0,g=0;//girl记录girl出现次数,g记录在'g'哪个位置出现
	for(int i=0;i<l;i++){
		char c = s[i];
		switch(c){
			case '.':break;
			case 'b':
				boy++;
				b=i;//记录'b'出现的位置 
				break;
			case 'o':
				if(b==i-1)break;//构成'bo'重复 
				//到这里,说明上一个不是'b' 
				b=i-1;  //假设上一个是'b',构成'bo' 
				boy++;
				break;
			case 'y':
				if(b==i-2)break;//构成'boy'重复
				boy++;
				break;
			case 'g':
				girl++;
				g=i;
				break;
			case 'i':
				if(g==i-1)break;
				g=i-1;
				girl++;
				break;
			case 'r':
				if(g==i-2)break;
				g=i-2;
				girl++;
				break;
			case 'l':
				if(g==i-3)break;
				girl++;
				break;
			default :
				break;
		}
	}
	
	printf("%d\n%d\n",boy,girl);
	return 0;
}

看了大佬的思路:

直接用 下标 卡 字符 出现的位置,非常巧妙,每种字符只有出现在特定位置时,才算,巧妙地避免了重复

代码

#include<stdio.h>
#include<string.h>

int main(){
	char s[255];
	scanf("%s",s);
	int l = strlen(s);
	
	int boy=0;
	int girl=0;
	for(int i=0;i<l;i++){
		if(s[i]=='.'){
			continue;
		}
		//每种字符出现在对的位置,只有一种情况,巧妙避免重复 
		if(s[i]=='b' || s[i+1]=='o' || s[i+2]=='y'){
			boy++;
		}
		if(s[i]=='g' || s[i+1]=='i' || s[i+2]=='r' || s[i+3]=='l'){
			girl++;
		}
	}
	
	printf("%d\n%d\n",boy,girl);
	return 0;
}

标签:boy,洛谷,int,单词,P1321,字符串,girl,include
From: https://blog.csdn.net/weixin_73999209/article/details/143648964

相关文章

  • 洛谷题单入门1顺序结构(C语言版)
    【入门1】顺序结构Hello,World!#include<stdio.h>intmain(){printf("Hello,World!");return0;}输出字符菱形#include<stdio.h>intmain(){printf("*\n");printf("***\n");printf("*****\n&q......
  • 【洛谷】P1427 小鱼的数字游戏
    题目描述小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字a(长度不一定,以 0 结束),记住了然后反着念出来(表示结束的数字 00 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问......
  • LeetCode 3014[输入单词需要的最少按键次数I]
    题目链接LeetCode3014[输入单词需要的最少按键次数I]详情实例实例1实例2提示题解思路一圈下来8个字母,每个字母按1次二圈下来16个字母,前8个字母每个按1次,后8个字母,每个按2次三圈下来24个字母,前8个字母每个按1次,中间8个字母,每个按2次,最后8个字母,每个按3次四圈下来......
  • 洛谷 P11268 【MX-S5-T2】买东西题 做题记录
    我不会贪心。\(a\)元的物品有\(b\)元的折扣,就相当于\(a\)元的物品有一张\(a-b\)元的优惠券。因为一张优惠券是满\(w\)元才可以用,所以可以用的物品在价格\(a\)上是一段区间\([a,\inf]\)。有一个很朴素的想法是,将每一个物品最多能省多少钱先弄出来,然后用优惠券想办法......
  • 【NOIP普及组】统计单词数
    【NOIP普及组】统计单词数......
  • 洛谷题单指南-二叉堆与树状数组-P1168 中位数
    原题链接:https://www.luogu.com.cn/problem/P1168题意解读:中位数就是位于中间的数,前1个数的中位数是第1个,前3个数的中位数是第2个,前5个数的中位数的第3个...以此类推。所以,此题本质上就是动态维护一组数,每1/3/5...等奇数个取第k小的数,取一次后k++。解题思路:要动态维护数据,且每......
  • 20241013 洛谷SCP模拟
    20241013洛谷SCP模拟J1.带余除法急眼了,J组T1做不出来。经cyq大神指点。考虑将题中给出的带余除法转化:\(n=kq+r\),移项得到\(r=n-kq\)。这里\(n,k\)都是定值,于是对于每一个\(q\),都有唯一的一个\(r\)与之对应。考虑余数的性质:\[0\ler=n-kq<q\]解不等式得到\(\lf......
  • 洛谷P1157 组合的输出(Python)
    伤痕,是男子汉的勋章。——圣斗士星矢一、题目P1157组合的输出https://www.luogu.com.cn/problem/P1157二、代码defpri(L):foriinrange(len(L)):ifL[i]==True:print("{:3d}".format(i),end='')defdfs(n,r,cur,count):#n,r为题......
  • 洛谷题单指南-二叉堆与树状数组-P2827 [NOIP2016 提高组] 蚯蚓
    原题链接:https://www.luogu.com.cn/problem/P2827题意解读:初始n个数,每次取最大值x,根据u/v分成两部分:x*u/v,x-x*u/v,然后其余数都增加q,整个过程重复m次。输出有两类数据:第t,2t,3t...次取出的最大值;最后剩余的数第t,2t,3t...个,从大到小输出。解题思路:直观上,通过模拟法可以实......
  • 洛谷P3870[TJOI20009]-开关
    时间复杂度越高的算法能模拟的结构就越多...题目大意:给定一串长度为n,元素只能为0或1的序列,默认该序列元素全为0.接下来需要进行m次操作,操作分为两种:1.把区间\([a,b]\)中的所有元素值取反.2.求区间\([a,b]\)中元素值为1的元素数量.每一次调用操作1时,每次一行输出一个......