途灵编程•全国二级(2022年3月)解题报告

途灵编程•全国二级(2022年3月)解题报告

A. 数字字符求和

题目描述

请编写一个程序实现以下功能:从一个字符串中,提取出所有的数字字符即 0-9,并作为数求和。

输入格式
一行字符串,长度不超过 100,字符串中不含空格。

输出格式
字符串中所有数字字符作为数的和

样例
样例输入
Lsd2f02k3ja3sdf223

样例输出
17

思路分析

检查字符串 t 中每个字符 t[i],如果字符 t[i] 是数字字符,则将数字 (t[i]-‘0’) 加入到和

int main() {
    string t;
    cin >> t;
    int s = 0;
    for (int i = 0; i <= t.size() - 1; i++)   // 字符串下标范围:0 ~ t.size()-1
    {
        if (t[i] >= '0' && t[i] <= '9')   // t[i]是数字字符
        {
            s = s + (t[i] - '0');   // t[i]-'0'是将数字字符转为数字,将数字加入和s
        }
    }
    cout << s;
    return 0;
}

B. 简单密码

题目描述

Julius Caesar曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后 5 位对应的字符来代替,这样就得到了密文。比如字符 A 用 F 来代替。如下是密文和明文中字符的对应关系。

密文 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
明文 V W X Y Z A B C D E F G H I J K L M N O P Q R S T U

你的任务是对给定的密文进行解密得到明文。

你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。

输入格式
一行,给出密文,密文不为空,而且其中的字符数不超过 200。

输出格式
输出一行,即密文对应的明文。

样例
样例输入
NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX

样例输出
IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES

思路分析

检查字符串 t 的每个字符 t[i],
如果 t[i] 是 F 到 Z 之间的某个字符,则转变为 t[i] 之前的第 5 个字符;
如果 t[i] 是 A 到 E 之间的某个字符,则需要转到 Z 和 Z 之前去取,所以转变为 t[i] + 26 - 5;
其他情况,不用转换字符t[i]。

int main()
{
	string t;
	getline(cin,t);  // 包含空格,需用getline输入字符串
	for(int i=0; i<=t.size()-1; i++)
	{
		if(t[i]>='F'&&t[i]<='Z')   // 取该字母之前的第5个字母
		{
			cout << char(t[i]-5);
		}
		else if(t[i]>='A'&&t[i]<='E')  // 需要转到Z和Z之前去取
		{
			cout << char(t[i]+26-5);
		}
		else
		{
			cout << t[i];
		}
	}
	return 0;
}

C. 进阶的卡莎

题目描述

虚空之女·卡莎考入了战斗学院,她的父亲虚空行者·卡萨丁要检查她的考试成绩。

已知卡莎一段时间内的成绩序列,请你帮卡萨丁计算卡莎在这段时间内最长的成绩连续上升(相等不算做连续上升)的长度。

例如,给出卡莎的成绩序列是 85 90 80 85 90 95 95 80 75 75,其中连续上升序列包括 “85 90” 和 “80 85 90 95” 两组,后者是最长的连续上升成绩序列(相等不算做连续上升),应该输出后者的长度 4。

输入格式
第一行是序列的长度 N (1 <= N <= 100)。

第二行给出序列中的 N 个整数,这些整数的取值范围都在 0 到 100。

输出格式
最长的成绩连续上升的长度(相等不算做连续上升)。

样例
样例输入
10
85 90 80 85 90 95 95 80 75 75

样例输出
4

思路分析

这是一个最值问题,也是一个计数问题,要统计连续上升的长度。
如果当前成绩大于上一次成绩,则连续上升长度加1,如果长度大于最大值擂主,则更新最大值擂主。
如果当前成绩小于等于上一次成绩,则连续上升长度变为1.

int main()
{
	int n;
	cin>>n;
	int a[101];
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	int t=1; // 连续上升序列长度
	int m=1;  // 最大值擂主	
	for(int i=2; i<=n; i++)
	{		
		if(a[i]>a[i-1])  // 当前成绩大于上次成绩
		{
			t++;
			if(t>m)
			{
				m=t;
			}
		}
		else
		{
			t=1;
		}		
	}
	cout<<m;
	return 0;
}

D. 合影效果

题目描述

小云和朋友们去爬香山,为美丽的景色所陶醉,想合影留念。如果他们站成一排,男生全部在左(从拍照者的角度),并按照从矮到高的顺序从左到右排,女生全部在右,并按照从高到矮的顺序从左到右排,请问他们合影的效果是什么样的(所有人的身高都不同)?

输入格式
第一行是人数 n(2 <= n <= 40,且至少有 1 个男生和 1 个女生)。

后面紧跟 n 行,每行输入一个人的性别(男 male 或 女 female)和身高(浮点数,单位米),两个数据之间以空格分隔。

输出格式
n 个浮点数,模拟站好队后,拍照者眼中从左到右每个人的身高。每个浮点数需保留到小数点后 2 位,相邻两个数之间用单个空格隔开。

样例
样例输入
6
male 1.72
male 1.78
female 1.61
male 1.65
female 1.70
female 1.56

样例输出
1.65 1.72 1.78 1.70 1.61 1.56

思路分析

这是排序问题。有两部分排序:男孩从矮到高,女孩从高到矮
首先,在输入数据时,将男孩和女孩分别存放到两个数组a和b中
然后,分别对两个数组排序,并输出排序后的结果。

int main()
{
	int n;
	string t;
	double a[41];  // 男孩身高数组
	double b[41]; // 女孩身高数组
	int j=0; // 男孩下标
	int k=0; // 女孩下标
	cin>>n;
	for(int i=1; i<=n; i++)
	{
		cin>>t;
		if(t=="male")   // 男孩
		{
			cin>>a[j];
			j++;
		}
		else  // 女孩
		{
			cin>>b[k];
			k++;
		}
	}
	sort(a+0,a+j);       //男孩从小到大排序,数据的下标范围是0 ~ j-1
	for(int i=0; i<=j-1; i++)
	{
		printf("%.2f ",a[i]);  // 注意2f后面有一个空格
	}
	sort(b+0,b+k,greater<double>());   //女孩从大到小排序,数据的下标范围是0 ~ k-1
	for(int i=0; i<=k-1; i++)
	{
		printf("%.2f ",b[i]);
	}
	return 0;
}

E. 割圆

题目描述

本题将实现一个简化版的“割圆”游戏。成功点亮所有灯时,联结第一个和最后一个灯称之为“割线”。

n 盏灯环形分布,顺序编号为 1到 n。灯的初始状态为关闭不亮。假设 n 为 7,则第 1 号灯与第 2、7 号灯相邻,第 2 号灯与第 1、3 号灯相邻,以此类推。

灯的点亮规则如下:

1、输入 m 个数,每个数为某个灯的编号,可能重复或只是部分编号;

2、m 个数中的第 1 个数所对应的灯,默认点亮;

3、 如果输入数对应灯的左侧或右侧已被点亮,则点亮自身。否则啥也不做;

4、如果所有的灯都已被点亮,则程序结束,m 个数中尚未被处理的数将不再处理;

5、输出第 1 次和最后一次点亮灯的编号;

6、如果 m 个数处理完毕尚未点亮所有灯,则输出 No。

输入格式
第一行 2 个整数 n,m,保证 3<=n<=1000,1<=m<=10000。

第二行 m 个数,每个数都在 1 到 n 之间,表示输入序列。

输出格式
如果完成了“割圆”,则输出两个整数,之间用一个空格隔开,否则输出 No。

样例
样例输入
7 10
2 3 1 7 5 6 5 4 4 2

样例输出
2 4

样例解释
第 1 个数 2,直接被点亮;
第 2 个数 3,3 与已亮的 2 相邻,被点亮;
第 3 个数 1,1 与已亮的 2 相邻,被点亮;
第 4 个数 7,7 与已亮的 1 相邻,被点亮;
第 5 个数 5,5 与 4 和 6 相邻,但 4 和 6 都没亮,什么都不做;
第 6 个数 6,6 与已亮的 7 相邻,被点亮;
第 7 个数 5,5 与已亮的 6 相邻,被点亮;
第 8 个数 4,4 与已亮的 5 相邻,被点亮;
此时,所有的数都被点亮,第 1 个点亮的是 2,最后点亮的是 4。

思路分析

这道题需要用一个数组b来模拟灯的亮与不亮,其中1表示亮,0表示不亮。
然后根据题目描述的点亮规则编写程序。点亮规则有三种情况:
(1)如果x为第1栈灯,即x=1,则需观察b[2]和b[n]是否等于1。
(2)如果x为最后1栈灯,即x=n,则需观察b[1]和b[n-1]是否等于1。
(3)x为中间情况,则需观察b[x-1]和b[x+1]是否等于1。
最后,当所有灯均点亮,即计数器t==n时,输出结果。

int main()
{
	int n,m;
	cin>>n>>m;
	int b[1001]= {0};  //初始时,所有灯都不亮,0表示不亮,1表示亮 
	int x;  
	cin>>x;  // 第1个数 
	b[x]=1;   //第1个数所对应的灯泡点亮
	int d=x;  //第1个点亮的灯泡编号 
	int t=1;  //已点亮的灯泡数	
	for(int i=2; i<=m; i++)   //后面的数 
	{
		cin>>x;
		if(b[x]==0)  //编号x的灯不亮 
		{
			// 如果左侧x-1或右侧x+1的灯已点亮其中之一,则点亮x(还包括x==1和x==n特殊情况) 
			if( (x==1&&(b[n]==1||b[2]==1)) || (x==n&&(b[1]==1||b[n-1]==1)) || (b[x-1]==1||b[x+1]==1) )  
			{
				b[x]=1;
				t++; //点亮数加1 
			}
			if(t==n)  //所有灯均点亮 
			{
				cout<<d<<" "<<x;  //输出结果 
				return 0;
			}
		}
	}
	cout<<"No";  //无法全部点亮 
	return 0;
}

邓老师:17773008810(岳阳市,途灵编程)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值