2021年北京化工大学女生赛-问题 I: 我只会心疼哥哥-题解
Posted Tisfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021年北京化工大学女生赛-问题 I: 我只会心疼哥哥-题解相关的知识,希望对你有一定的参考价值。
我只会心疼哥哥
时间限制:1秒
空间限制:128M
题目描述
哥哥在生活中经常扮演者保护妹妹的角色。有的“好”妹妹懂得心疼哥哥。但是心疼哥哥的前提是拥有哥哥。
这是一些常见的亲戚关系中英文对应表:
中文 | 英文 |
---|---|
哥哥 | elder brother |
姐姐 | elder sister |
弟弟 | younger brother |
妹妹 | younger sister |
爸爸妈妈 | parents |
爷爷奶奶 | grandparents |
儿子 | son |
女儿 | daughter |
爸爸的哥哥 | father’s elder brother |
当然还有很多其他的称谓,但是保证本题只会出现这些称谓。
输入描述
给你一行一个字符串(长度 ≤ 5000 \\leq 5000 ≤5000),是小T的亲戚关系。
每个亲戚之间,用一个逗号和一个空格隔开。
例如:小T有一个哥哥和一个姐姐,输入为:elder brother, elder sister
。
输出描述
如果小T拥有哥哥(输入中含有“elder brother”),那么请输出I can do nothing but to 'Xin Teng Gie Gie'
,否则请输出I have no elder brother ~_~
。
样例一
输入
elder brother, elder sister, younger brother, younger sister, younger sister, parents, grandparents, son, daughter
输出
I can do nothing but to 'Xin Teng Gie Gie'
说明
第一位亲戚即为“哥哥”,所以小T拥有哥哥。
样例二
输入
elder sister, younger brother
输出
I have no elder brother ~_~
说明
小T只有姐姐和弟弟,所以小T没有哥哥
题目分析
这题就判断输入的字符串中是否含有’ e l d e r b r o t h e r elder\\ brother elder brother'就行了。
提供两种语言的思路:
第一种:C语言
因为可能有多个亲戚,所以定义两个变量 l e f t left left 和 r i g h t right right,分别代表其中一个亲戚的开始下标和结束下标,然后对于这位亲戚,看是不是 e l d e r b r o t h e r elder\\ brother elder brother。
对于这位亲戚,先看第一个字符是不是空格。如果是,就把这位亲戚的起始下标后移一位。
然后看长度是否正好是 e l d e r b r o t h e r elder\\ brother elder brother 的长度(13).如果是13,就逐个比较是不是 e l d e r b r o t h e r elder\\ brother elder brother 即可。
只要含有 e l d e r b r o t h e r elder\\ brother elder brother ,就说明拥有哥哥。
第二种:Python
Python中自带split,可以先以逗号+空格为分隔,得到每一位亲戚的名称,然后之间判断是否正好为 e l d e r b r o t h e r elder\\ brother elder brother 就行了。
注意事项
- 这道题哥哥亲戚的分隔是逗号+空格,而第一位亲戚前面是没有空格的,这一点需要注意。
- 注意题目关系表中不只有 e l d e r b r o t h e r elder\\ brother elder brother,还有 f a t h e r ′ s e l d e r b r o t h e r father's\\ elder\\ brother father′s elder brother,所以不能仅看字符串中是否存在 e l d e r b r o t h e r elder\\ brother elder brother。
AC代码
C语言
MinGW gcc可编译通过
#include<stdio.h>
#include<string.h>
char ori[5010]; // 用来存放输入字符串的数组
const char GeGe[]={"elder brother"}; // 这个字符串是“哥哥”
int isGeGe(char c[],int l,int r) // 判断这位亲戚是不是“哥哥”。如果是,就返回1,不是返回0(C语言不带bool)
{
if(c[l]==' ')l++; // 如果这位亲戚的第一位是空格,起始位置后移一位
if(r-l+1!=13)return 0; // 如果这位亲戚的长度不为13,肯定不是“哥哥”
int i; // 这位亲戚名称的第i位
for(i=0;i<13;i++) // 从0到13逐个比较,看是不是和“哥哥相同”
if(c[l+i]!=GeGe[i]) // 有一个不同直接pass
return 0; // 返回0
return 1; // 全部相同返回1
}
int main()
{
gets(ori); // 输入原始字符串。因可能存在空格,故不能使用scanf
int l=strlen(ori); // 字符串长度
ori[l]=',',ori[l+1]='\\0'; // 为了方便,把字符串最后一位置为“,”
int left=0; // 每位亲戚的开始下标,初始值是0
int have=0; // 是否有哥哥。0代表没有
int right; // 每位亲戚的结束下标
for(right=1;right<=l;right++) // 从1到l
{
if(ori[right]==',') // 这一位是逗号,说明到了一位亲戚名称的结尾
{
have|=isGeGe(ori,left,right-1); // 0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1。|=操作不会把have由1变成0,但能使其由0变成1
left=right+1; // 下一位亲戚的起始下标是逗号的下一位
}
}
puts(have?"I can do nothing but to 'Xin Teng Gie Gie'":"I have no elder brother ~_~"); // puts: 有哥哥吗 ? 如果由,输出“心疼哥哥” : 如果没,输出“没有哥哥”
return 0; // 返回结束
}
Python
小心超时
ori = input().split(', ')
for i in ori:
if i == 'elder brother':
print("I can do nothing but to 'Xin Teng Gie Gie'")
exit(0)
print("I have no elder brother ~_~")
原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/117339731
以上是关于2021年北京化工大学女生赛-问题 I: 我只会心疼哥哥-题解的主要内容,如果未能解决你的问题,请参考以下文章
北京化工大学第17届程序设计竞赛 - 女生赛 - 2022.08.28 - 问题 B:谁是今天的女王
北京化工大学第17届程序设计竞赛 - 女生赛 - 2022.08.28 - 问题 A: You love JSON. Aren‘t you?