天梯赛选拔补题1

4 篇文章 0 订阅
2 篇文章 0 订阅

7-2 6翻了

题目描述

Alt
“666”是一种网络用语,大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思。如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字“27”,因为这是 3 个 “9”!

本题就请你编写程序,将那些过时的、只会用一连串“6666……6”表达仰慕的句子,翻译成最新的高级表达。

输入格式

输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。

输出格式

从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。

输入样例

it is so 666 really 6666 what else can I say 6666666666

输出样例

it is so 666 really 9 what else can I say 27
代码长度限制      16 KB
时间限制         400 ms
内存限制         64 MB

代码

#include <bits/stdc++.h>
using namespace std;
int main(){
	char s[1001],s1[1001];
	int j=0;//s1下标
	//gets(s);//能读取含空格的字符串,cin、scanf不可
	cin.getline(s,1001);//若是string类型:getline(cin,s)
	
	for(int i=0;s[i]!='\0';){//注意字符串结尾
	
	    /*若不是字符6,则直接复制到s1中*/
		if(s[i]!='6'){
			s1[j]=s[i];
			j++;
			i++;
		}
		
		/*是字符6,看看有几个*/
		else{
			int t=0;//记录字符6的个数
			int k;
			for(k=i;s[k]!='\0';k++){
				if(s[k]!='6'){
					break;
				}
				t++;
			}
			
			/*对字符6个数不同情况进行处理,注意i,j的处理*/
			if(t>3&&t<10){
				s1[j++]='9';
				i=k;
			}
			else if(t>=10){
				s1[j]='2';
				s1[j+1]='7';
				j+=2;
				i=k;
			}
			else{
				s1[j++]=s[i];
				i++;
			}
		}
		
	}
	//注意字符串以\0结尾,否则puts会出现乱码
	s1[j]='\0';
	puts(s1);
	return 0;
}

总结

1、本题可以对字符串知识进行巩固,gets(),puts()可以输入输出字符数组,strlen()可测字符数组/字符串常量长度(不包括’\0’在内);用puts及strlen函数字符串必须要以’\0’结尾。
2、
(1)scanf读取字符时从第一个非空格、tab、回车的字符开始读取;scanf读取字符数组遇到空格、tab、回车时终止并把其留在输入缓冲区(例:char str[10];scanf(“%s”,str);printf(“%s”,str););gets读取字符数组str[]时遇到回车终止,并丢弃回车,把其余字符写入str[];cin、getline读取string字符串时分别与scanf、gets相同;
(2)输入与输出是两个独立的缓冲区,printf、cout输出换行对输入无影响;
(3)scanf、printf、cin、cout、gets、puts、cin.getline可以输入输出char字符数组,cin、cout、getline可用于输入输出string类字符串,感觉不太熟悉时可以自己编码实现一下,看看结果~

字符串输入输出

3、推荐阅读
(1) PAT关于gets编译错误
(2)sizeof()用法、strlen()用法、string()用法

7-3 敲笨钟

题目描述

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。

现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。

输入格式

输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。

输出格式

对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。

输入样例

5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.

输出样例

xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.
Skipped
xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.
Skipped
Skipped
代码长度限制      16 KB
时间限制         400 ms
内存限制         64 MB

代码

#include <bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	getchar();//
	
	while(n--){
		
		char s[101];
		int flag=0;
		cin.getline(s,101);//
		
		int k;//记录倒数第3个空格的位置
		for(int i=0;s[i]!='\0';i++){	
			if(s[i]==','){
				if(s[i-1]=='g'&&s[i-2]=='n'&&s[i-3]=='o'){
					flag=1;
				}
			}
			if(flag==1&&s[i]=='.'){
				
				if(s[i-1]=='g'&&s[i-2]=='n'&&s[i-3]=='o'){//压ong韵
					int t=0;
					for(int j=i;j>=0;j--){//找最后3个字之前的空格
						if(s[j]==' '){
							t++;
						}
						if(t==3){
							k=j;
							break;
						}
					}
				}
				else{
					flag=0;
				}
				
			}
		}
		
		if(flag==0){
			cout<<"Skipped"<<endl;
		}
		else{
			char s1[101];
			int i;
			//把前面的字符复制到s1中
			for(i=0;i<=k;i++){
				s1[i]=s[i];
			}
			s1[i]='\0';
			printf("%s",s1);//注意输出方式
			puts("qiao ben zhong.");
		}
	}
	return 0;
}

总结

本题也是关于字符串的,前面的那个题对字符串的知识进行回顾后,再做这个就容易多了,要注意的是最后的输出,先将前面的内容输出,再puts(“qiao ben zhong.”)就可以了。

7-12 深入虎穴

题目描述

著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报。已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门。每一扇门背后或者是一个房间,或者又有很多条路,同样是每条路通向一扇门…… 他的手里有一张表格,是其他间谍帮他收集到的情报,他们记下了每扇门的编号,以及这扇门背后的每一条通路所到达的门的编号。007 发现不存在两条路通向同一扇门。

内线告诉他,情报就藏在迷宫的最深处。但是这个迷宫太大了,他需要你的帮助 —— 请编程帮他找出距离入口最远的那扇门。

输入格式

输入首先在一行中给出正整数 N(<10^5),是门的数量。最后 N 行,第 i 行(1≤i≤N)按以下格式描述编号为 i 的那扇门背后能通向的门:

K D[1] D[2] ... D[K]

其中 K 是通道的数量,其后是每扇门的编号。

输出格式

在一行中输出距离入口最远的那扇门的编号。题目保证这样的结果是唯一的。

输入样例

13
3 2 3 4
2 5 6
1 7
1 8
1 9
0
2 11 10
1 13
0
0
1 12
0
0

输出样例

12
代码长度限制      16 KB
时间限制         400 ms
内存限制         64 MB

代码

#include <bits/stdc++.h>
using namespace std;
int n,etop,door,sum;

//边
struct EDGE{
	int u,v;//端点
	EDGE *nex;//下一条边
}epool[1000001];

//点
struct NODE{
	EDGE *fir;//第一条边
}nodes [100001];

void addedge(int u,int v){
	epool[etop].u=u;
	epool[etop].v=v;
	epool[etop].nex=nodes[u].fir;//当前边的下一条边是以u为起点的的第一条边
	nodes[u].fir=&epool[etop];//更新点u的第一条边为当前边
	etop++;
}

int bfs(int x){
	queue<int> q;
	q.push(x);
	sum++;
	
	while(!q.empty()){
		int start=q.front();
		q.pop();
		door=start;
		EDGE *e=nodes[start].fir;
		while(e!=NULL){//遍历start点连接的所有边
			q.push(e->v);
			e=e->nex;
			sum++;
		}
	}
	
	if(sum==n)
	return 1;
	else
	return 0;
}

int main(){
	cin>>n;
    
	int t=1;
	int num,x;
	while(t<=n){
		cin>>num;
		
		for(int i=0;i<num;i++){
			cin>>x;
			//添加边(以t为起点,x为终点)
			addedge(t,x);
		}
		
		t++;
	}
	
	//寻找入口(能到达所有点)
	for(int i=1;i<=n;i++){
		sum=0;
		if(bfs(i))
		break;
	}
	
	cout<<door<<endl;
	return 0;
}

总结

1、这个题做的很曲折…,首先根据样例画图-是一棵树,可以判断出这是个bfs题,再者n很大,得用邻接表存图,否则会超时,还有一点这个题没有说1就是入口…,所以得找入口,上面的代码有一个样例超时了,还没想出更好的办法来,想出来的话再回来补。
2、邻接表的相关内容可以看我的博客-邻接表~~
推荐阅读:一般竞赛二维数组最大设置成多大?
即4000*4000二维,1.6✖10^7一维

小结一下
1、无论什么比赛,赛前基础要过一遍,一些基础题不能丢分,同样适用于考试
2、赛后一定要补题(补题的重要性谁补谁知道~),查漏补缺,看自己哪些知识没掌握,记录并解决掉

推荐文章:
如何正确刷题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值