第十五届蓝桥杯大赛软件赛省赛第二场部分题解(C/C++研究生组)

分享一下参加第十五届蓝桥杯当时的答案,本人水平有限,希望各位勿喷。

【问题描述】
8100178706957568 这个数在用 x 进制表示时 ( x [11 , 36] ) ,仅包含数字而
不包含字母,请问 x 是多少。比如 2588 16 进制表示为 a 1 c ,包含字母 a
c
答案:32
C++代码:
#include <iostream>
using namespace std;
int main(){
	long long n;
	cin>>n;
	
	for(int i=11;i<=36;i++)
	{
		long long c=n;
		int flag=0;
	   	while(c/i)
		   {
		   	if(c%i>9)
		   	{
		   		flag=1;
			}
			
			c=c/i;
		}
		if(flag==0)
		{
			cout<<i;	
		}
			
	}
	
} 
【问题描述】
有一个数组,包含 1 n n 个整数,初始为一个从小到大的有序排列 :
{ 1 , 2 , 3 , 4 , · · · , n } 。一次随机交换操作指:均匀随机选取两个位置 i , j [1 , n ]
i , j ,然后交换数组中这两个位置上的数。那么对于 n = 51 ,对初始数组进行
两次随机交换操作之后,数组中的 逆序对 的数量的期望是多少个。
答案:65.33
思路:暴力解法,先交换一次,然后再赋值给另外一个数组,再继续交换一次。
C++代码:
	#include <iostream>
	#include <iomanip> 
	#include <typeinfo>
	using namespace std;
	int main(){
	
		int a[51],c[51]; 
		for(int i=0;i<51;i++)
		{
			a[i]=i+1;
			 
		}
		int b=1,t,count=0,z=0;
		double changec=0.0;
			for(int j=0;j<50;j++)
			{	
				b=j+1;
				while(b<=50)
				{
				t=a[j];
				a[j]=a[b];
				a[b]=t;			
				for(int i=0;i<51;i++)
				{
				c[i]=a[i];	 
				}
				for(int s=0;s<50;s++)
				{
				z=s+1;
				while(z<=50)
				{
				t=c[s];
				c[s]=c[z];
				c[z]=t;
				changec=changec+1;
				for(int k=0;k<50;k++)
				{
					for(int m=k+1;m<51;m++)
					{
						if(c[k]>c[m])
						{
							count++;
						}
					}
				}				
				t=c[z];
				c[z]=c[s];
				c[s]=t;
				z++;
				}
				}
				t=a[b];
				a[b]=a[j];
				a[j]=t;	
				b++;
				}			
			}
		double last;
		last=count/(changec);
			
		cout<< fixed << setprecision(2) <<last;
		
	}
【问题描述】
小蓝在环球旅行时来到了一座古代遗迹,里面并排放置了 n 个传送阵,进
入第 i 个传送阵会被传送到第 a i 个传送阵前,并且可以随时选择退出或者继续
进入当前传送阵。
小蓝为了探寻传送阵中的宝物,需要选择一个传送阵进入,然后连续进入
之后的传送阵。小蓝希望尽可能多地进入传送门以便搜索宝物,同时他可以使
用一次魔法,从某个传送阵 j 走到相邻的(第 j 1 或第 j + 1 个)传送阵,请
问小蓝最多能到达多少个不同的传送阵?一个传送阵可多次进入,但在计算答
案时只算一个。
【输入格式】
输入的第一行包含一个正整数 n
第二行包含 n 个正整数 a 1 , a 2 , · · · , a n ,相邻整数之间使用一个空格分隔。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
5
2 1 5 4 3
【样例输出】
4
【样例说明】
小蓝的路径可以是: 1 2 3 5 。其中 2 3 使用魔法。
C++代码:
#include <iostream>
#include <vector>
using namespace std;
long long n;
vector<long long> csm,vist;
long long con=1,cishu=0;
void dfs(long long a)
{
//	cout<<a<<endl;
	if(vist[a]==1)
	{
		return;
	}

	if(vist[a]==0)
	{
		cishu++;
//		cout<<"cishu"<<cishu<<endl;
		vist[a]=1;
		dfs(csm[a]);
	}
	if(vist[a]==1&&con==1)//使用魔法 
	{
//		cout<<"mofa"<<a<<endl; 
		con=0; 
		long long mf;
		mf=a+1;
		if(mf>n||vist[mf]==1)
		{
			mf=a-2;
			if(mf<1||vist[mf]==1)
			{
				return; 
			}
			else{
//				cishu++;
				dfs(mf);
			}
	
		}
		else{
//			cishu++;
			dfs(mf);
		}
		
	}
	
}
int main()
{

	cin>>n;
	csm.push_back(0);
	vist.push_back(0);
	for(long long i=1;i<=n;i++)
	{
		long long t;
		cin>>t;
		csm.push_back(t);
		vist.push_back(0);
	}

	dfs(1);
	cout<<cishu;
	return 0;
}
【问题描述】
小蓝找到了一个外星文明留下来的遗迹,遗迹大门的屏幕上有一个长度为
m 的字符串 t 和一个输入框,下面还有一个键盘,键盘为一个长度为 n 的字符
s ,由一个可以横向移动的指针来敲击键盘,指针可以向左移或向右移,不
能移出键盘。
小蓝需要在键盘字符串 s 上先指定指针初始位置然后不断移动指针的位置,
过程中通过敲击指针所在的字符来进行输入。然而,指针最多只能移动 L 的距
离,小蓝想输入一个尽可能长的一个 t 的前缀,请问他最多能输入多少位。
【输入格式】
输入的第一行包含三个正整数 n , m , L ,相邻整数之间使用一个空格分隔。
第二行包含一个长度为 n 的字符串 s
第三行包含一个长度为 m 的字符串 t
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
3 6 5
abc
acbbac
【样例输出】
5
【样例说明】
初始选择指针位于键盘 abc 上的 a ,输入 acbbac 6 个字符分别需要指针
移动 0 , 2 , 1 , 0 , 1 , 2 的距离,而最大移动距离为 5 ,所以最多输入 5 个字符,移
0 + 2 + 1 + 0 + 1 = 4 的距离。
【评测用例规模与约定】
对于 20 % 的评测用例, 1 m 20
对于所有评测用例, 1 n 10 3 1 m 10 5 1 L 10 9 s , t 中只包
含小写字母,且 s 中一定包含所有 t 中出现过的字母,数据保证随机。
C++代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string a,b;
long long max1=-1;
long long count=0;
long long n,m,L;
long long deng=0;
void dfs(long long i,long long j,long long l) {
	if(l==0) {
//		cout<<count<<endl;
//		if(a[i]==b[j]) {
//			
//			cout<<"i "<<i<<" "<<a[i]<<endl;
//			cout<<"j "<<j<<" "<<b[j]<<endl;
//			count++;
//			deng++;
//			cout<<"deng"<<deng;
//		    }
	if(max1<count) {
		max1=count;
		
	}
	return;
	}
	if(a[i]!=b[j]) {
		if(j<n-1&&j>0) {
			dfs(i,j+1,l-1);
			dfs(i,j-1,l-1);
		}
		if(j==0) {
			dfs(i,j+1,l-1);
		}
		if(j==n-1) {
			dfs(i,j-1,l-1);
		}
	}
	if(a[i]==b[j]) {
//		cout<<"i "<<i<<" "<<a[i]<<endl;
//		cout<<"j "<<j<<" "<<b[j]<<endl;
		count++;
//		cout<<count;
//		cout<<"i"<<i<<endl;
		if(i<n-1) {
			i=i+1;
		} 
		else {
			i=0;
			}
//		cout<<j<<endl;
		if((j<n-1&&j>0)) {
			dfs(i,j+1,l-1);
			dfs(i,j-1,l-1);
		}
		if(j==0) {
			dfs(i,j+1,l-1);
		}
		if(j==n-1) {
			dfs(i,j-1,l-1);
				}
			}
		}
int main() {
	cin>>n>>m>>L;
	cin>>a;
	cin>>b;
	dfs(0,0,L);
	cout<<max1;
	return 0;
}

剩下的没时间做了。。我把题目放在下面,有能力的大佬可以做一下。

        
目前尚未有2024年第十四届蓝桥杯大赛软件C/C++大学B的真题与题解发布,因为该事的时间线可能还未到达公布阶段[^1]。然而,可以基于以往的比形式和内容推测其考察的知识点范围以及提供一些常见的练习方向。 以下是关于如何准备此类比的一些指导: ### 准备指南 #### 一、熟悉基础算法 掌握基本的数据结构和经典算法对于参者至关重要。这包括但不限于数、链表、栈、队列等数据结构的应用;排序(快速排序、归并排序)、查找(二分法)、动态规划等问题解决方法的学习与实践。 ```cpp // 快速排序实现 (C++) void quickSort(int arr[], int low, int high){ if(low < high){ int pi = partition(arr,low,high); quickSort(arr, low, pi-1); quickSort(arr, pi+1, high); } } int partition (int arr[], int low, int high){ int pivot = arr[high]; int i = (low - 1); for (int j = low; j <= high- 1; j++){ if (arr[j] < pivot){ i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return (i + 1); } ``` ```java // 快速排序实现 (Java) public static void quickSort(int[] array, int start, int end) { if(start >= end) return; int pivotIndex = partition(array, start, end); quickSort(array, start, pivotIndex - 1); quickSort(array, pivotIndex + 1, end); } private static int partition(int[] array, int start, int end) { int pivotValue = array[end]; int index = start; for(int i=start;i<end;i++) { if(array[i]<pivotValue) { swap(array,i,index++); } } swap(array,end,index); return index; } ``` #### 二、深入理解编程语言特性 无论是使用C++还是Java参加竞,都需要深入了解所选语言的特点及其标准库的功能。例如,在C++中熟练运用STL容器类如vector、map等能够极大提高编码效率;而在Java里,则需熟知Collections框架下的各类集合类型及其实现原理。 #### 三、模拟实战训练 通过历年试题进行反复演练是非常有效的备考方式之一。虽然现在无法获取到最新的2024年具体题目,但是可以通过分析往年的考题来预测可能出现的新颖考点,并针对性加强薄弱环节。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值