第十届蓝桥杯c++b组国赛题解(还在持续更新中...)

news2024/11/23 11:38:02

试题A:平方序列

image解题思路:

直接枚举一遍x的取值,然后按照题目给定的式子算出y,每次取x+y的最小值即可
答案为7020

代码实现:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define int long long
const int N=1e4+5;
signed main(){
	//记录答案 
	int res=0x3f3f3f3f;
	//循环枚举x 
	for(int i=2020;i<=N;i++){
		//计算y*y; 
		int t=2*i*i-2019*2019;
		//判断该值是否是完全平方数 
		int j=sqrt(t);
		//如果是表示存在y,使得y*y满足题目的等差数列
		//每次记录x+y的最小值 
		if(j*j==t)res=min(j+i,res);
	}
	cout<<res<<endl;
	return 0;
}

试题B:质数拆分

image解题思路:

先将1~2019中的所有质数筛选出来,将每个质数视为一个价值为自身值的物品,然后直接利用背包问题求解,即从前i个物品中选,且当前价值为j的所有选法数。
考虑状态转移方程
1.不选当前物品:dp[i][j]+=dp[i-1][j];
2.选当前物品:dp[i][j]+=dp[i-1][j-w[i]];
答案为55965365465060

代码实现:
二维未优化版本

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define int long long
const int N=2500;
int prime[N],vis[N],cnt;
//dp[i][j]表示从前i个物品中选且当前值为j的选法数 
int dp[N][N];
void init(int n){
	for(int i=2;i<=n;i++){
		if(!vis[i])prime[++cnt]=i;
		for(int j=1;prime[j]*i<=n;j++){
			vis[prime[j]*i]=1;
			if(i%prime[j]==0)break;
		}
	}
}
signed main(){
	//利用线性筛将1~2019中的质数都筛选出来存储到prime数组中
	//由于背包问题下标习惯从1开始,所以prime数组存储的质数下标从1开始 
	init(2019);
	//如果价值为0,则选法只有不选这一种 
	for(int i=0;i<=cnt;i++)dp[i][0]=1; 
	for(int i=1;i<=cnt;i++){
		for(int j=1;j<=2019;j++){
			//不选当前物品 
			dp[i][j]+=dp[i-1][j];
			//选当前物品 
			if(j>=prime[i])dp[i][j]+=dp[i-1][j-prime[i]];
		}
	}
	cout<<dp[cnt][2019]<<endl;
	return 0;
}

一维优化版本

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define int long long
const int N=2500;
int prime[N],vis[N],cnt; 
int dp[N];
void init(int n){
	for(int i=2;i<=n;i++){
		if(!vis[i])prime[++cnt]=i;
		for(int j=1;prime[j]*i<=n;j++){
			vis[prime[j]*i]=1;
			if(i%prime[j]==0)break;
		}
	}
}
signed main(){
	//利用线性筛将1~2019中的质数都筛选出来存储到prime数组中
	//由于背包问题下标习惯从1开始,所以prime数组存储的质数下标从1开始 
	init(2019);
	dp[0]=1;
	for(int i=1;i<=cnt;i++){
		for(int j=2019;j>=0;j--){
			if(j>=prime[i])dp[j]+=dp[j-prime[i]];
		}
	}
	cout<<dp[2019]<<endl;
	return 0;
}

试题C:拼接

image解题思路:

代码实现:

试题D:求值

image解题思路:

直接for循环遍历,每次求当前数的约数个数,如果当前约数个数为100,则输出结果并退出循环
约数个数求法:image
答案为45360

代码实现:

#include<iostream>
#include<unordered_map>
using namespace std;
#define int long long
unordered_map<int,int>mp;
void divide(int x){
	//从前往后遍历,求解x的质因子及其次幂 
    for(int i=2;i<=x/i;i++){
        //如果当前数能够被x整除,说明i是x的一个因子 
		//求解i的次幂 
		while(x%i==0){
            x/=i;
            mp[i]++;
        }
    }
    //别忘了最后为除尽的数 
    if(x>1)mp[x]++;
}
signed main(){
	//for循环遍历一遍,求每个数的约数个数 
    for(int i=100;i;i++){
    	mp.clear();
    	int res=1;
    	//分解质因数 
    	divide(i);
    	//根据公式求解当前数的约数个数 
    	for(auto t:mp)res=res*(t.second+1);
		//如果当前数的约数个数为100,则输出当前答案并返回 
		if(res==100){
			cout<<i<<endl;
			break;
		}
	}
    return 0;
}

试题E:路径计数

image解题思路:

从起点(0,0)开始dfs,dfs每次可以往上、下、左、右四个方向走,每次走过的点都要标记一下,不能重复走,如果步数大于12,则直接return,如果回到了起点(0,0)且当前步数大于2则答案加1
答案为206\(\textcolor{red}{注意步数必须大于2,由于起点是没有被标记的,那么会存在从起点出发立即回到起点的情况,其步数等于2,但是这是不合法的走法}\)

代码实现:

#include<iostream>
#include<unordered_map>
using namespace std;
#define int long long
const int N=10;
int res,vis[N][N];
//模拟上下左右四个方向 
int d1[4]={0,0,1,-1}; 
int d2[4]={1,-1,0,0};
//x,y表示当前所在位置,cnt表示当前的步数 
void dfs(int x,int y,int cnt){
	//如果步数大于题目要求的12,直接return 
	if(cnt>12)return;
	//如果步数大于2而且当前在起点(0,0),则答案加1并返回 
	if(cnt>2&&x==0&&y==0){
		res++;
		return;
	}
	//往上下左右四个方向递归 
	for(int i=0;i<4;i++){
		int x1=x+d1[i];
		int y1=y+d2[i];
		//如果被标记了或者越界了,则不能走 
		if(x1<0||x1>5||y1<0||y1>5||vis[x1][y1])continue;
		//标记当前位置被走过了 
		vis[x1][y1]=1;
		//递归,步数加1 
		dfs(x1,y1,cnt+1);
		//恢复现场 
		vis[x1][y1]=0;
	}
}
signed main(){
	dfs(0,0,0); 
	cout<<res<<endl;
    return 0;
}

试题F:最优包含

image解题思路:

考虑状态转移方程:
dp[i][j]指s1以第i位结尾,s2以第j位结尾的最少修改次数
当s1[i]==s2[j]时,则可以不修改s1,所以dp[i][j]=dp[i-1][j-1]
当s1[i]!=s2[j]时,有两种情况:
1)不修改s1[i],让s1的前i-1个字符与s2前j个字符匹配,此时修改次数不变(因为是包含关系),即dp[i][j]=dp[i-1][j]
2)修改s1[i],让s1的前i-1个字符与s2前j-1个字符相等,此时修改次数加一,即dp[i][j]=dp[i-1][j-1]+1

代码实现:

#include<iostream>
#include<cstring>
using namespace std;
#define int long long
const int N=1005;
//dp[i][j]指s1以第i位结尾,s2以第j位结尾的最少修改次数
int dp[N][N]; 
signed main(){
	//因为求最小值,所以初始化为最大值 
	memset(dp,0x3f,sizeof dp);
	string s1,s2;
	cin>>s1>>s2;
	//一般dp下标从1开始,所以让字符串前补个空格 
	s1=" "+s1;
	s2=" "+s2;
	//边界条件:当s2长度为0时,不需要修改,故为0 
	for(int i=0;i<=s1.size();i++)dp[i][0]=0;
	for(int i=1;i<=s1.size();i++){
		for(int j=1;j<=s2.size();j++){
			//如果s1[i]==s2[j],则s1的第i位和s2的第j位不需要考虑
			//故dp[i][j]=dp[i-1][j-1] 
			if(s1[i]==s2[j])dp[i][j]=min(dp[i][j],dp[i-1][j-1]);
			else{
				//如果s1[i]!=s2[j],存在2种情况,可以修改,也可以不修改
				//如果修改,则dp[i][j]=d[i-1][j-1]+1;
				//如果不修改,则dp[i][j]=dp[i-1][j]
				//取二者最小值 
				dp[i][j]=min(dp[i][j],min(dp[i-1][j-1]+1,dp[i-1][j]));
			}
		}
	}
	cout<<dp[s1.size()][s2.size()]<<endl;
    return 0;
}

试题H:解谜游戏

imageimageimage解题思路:

经过观察,每一次旋转只能三个圈一起旋转,但是边长不同,内圈四次一周,中圈八次一周,外圈十二次一周。
设初始时的棒号为内圈0-3,中圈0-7,外圈0-11。
假设内圈的0号棒转动顺时针一周(即整体顺时针转动4次)再次回到0号位置,中圈则是原来的4号棒到了0号位置;外圈则是原来的8号棒到了0号位置。整体再顺时针转动一周的话,内圈的0号位置还是初始时的0号棒,中圈也还是初始的0号棒,外圈则是4号棒;
上述依次类推,会发现内圈的每一根棒无论整体怎么转动都是跟着中圈的两根棒和外圈的三根棒的。
即内圈每一根棒都是跟中圈的两根还有外圈的三根是绑定的。image
最后我们可以判断对于这些下标组成的点,绿=3?红=2?黄=1?若满足,我们可以在有限次旋转和交换操作中使得绿色全部移动到外圈,红色全部移动到中圈,黄色移动到内圈

代码实现:

#include<iostream>
#include<unordered_map>
using namespace std;
#define int long long
unordered_map<char,int>mp;
signed main(){
  int t;
  cin>>t;
  while(t--){
    string s1,s2,s3;
    cin>>s1>>s2>>s3;
    int flag=1;
    for(int i=0;i<4;i++){
      mp.clear();
      //外圈 
      mp[s1[i]]++;
      mp[s1[i+4]]++;
      mp[s1[i+8]]++;
      //中圈 
      mp[s2[i]]++;
      mp[s2[i+4]]++;
      //内圈 
      mp[s3[i]]++;
      if(mp['G']!=3||mp['R']!=2||mp['Y']!=1){
        flag=0;
        break;
      }
    }
    if(flag)cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
  } 
  return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

栈帧之操作数栈(Operand Stack)和动态链接(Dynamic Linking)解读

操作数栈 概念 每一个独立的栈帧除了包含局部变量表以外&#xff0c;还包含一个后进先出&#xff08;Last-In-First-Out&#xff09;的 操作数栈&#xff0c;也可以称之为表达式栈&#xff08;Expression Stack&#xff09; 操作数栈&#xff0c;在方法执行过程中&#xff0c…

浅析设计模式5 -- 责任链模式

我们在进行软件开发时要想实现可维护、可扩展&#xff0c;就需要尽量复用代码&#xff0c;并且降低代码的耦合度。设计模式就是一种可以提高代码可复用性、可维护性、可扩展性以及可读性的解决方案。大家熟知的23种设计模式&#xff0c;可以分为创建型模式、结构型模式和行为型…

【Kubernetes 架构】了解 Kubernetes 网络模型

Kubernetes 网络使您能够在 k8s 网络内配置通信。它基于扁平网络结构&#xff0c;无需在主机和容器之间映射端口。 Kubernetes 网络支持容器化组件之间的通信。这种网络模型的主要优点是不需要在主机和容器之间映射端口。然而&#xff0c;配置 Kubernetes 网络模型并不是一件容…

随机过程与排队论(四)

设有2个红球&#xff0c;4个白球&#xff0c;先将它们分放到甲、乙两个盒子中去&#xff0c;各方3个。设X为甲盒中的红球数&#xff0c;然后再在甲、乙两盒各取一个进行交换。设Y为此时甲盒中的红球数。 求X的分布律。已知X的条件下求Y的分布律。求Y的分布律。 概率空间(Ω…

springboot+vue医院网上预约挂号系统4n9w0

在线挂号平台已经成为它运营过程中至关重要的因素。医院挂号管理系统&#xff0c;是在计算机与通信设备十分完备的基础上&#xff0c;为医院管理人员、医生、用户提供的系统化的管理平台。 本系统需要实现基础的医院介绍、线上挂号、在线咨询、医生请假等几个主要功能。 管理员…

fftw3库在Android Studio中的编译和使用

fftw3库是快速傅里叶变换FFT/IFFT的开源实现&#xff0c;可以在多个平台编译。在Android app开发项目中需要做FFT信号分析&#xff0c;优先使用JNI的方式&#xff0c;使用原生语言C/C实现复杂的科学计算任务。fftw3可以在多个平台编译优化&#xff0c;也可以在Android NDK开发时…

微信小程序nodejs+vue剧本杀游戏设计与实现

开发语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发 析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了小程序的需求基础上需要进一步地…

第十二届蓝桥杯c++b组国赛题解(还在持续更新中...)

试题A&#xff1a;带宽 解题思路&#xff1a; 由于小蓝家的网络带宽是200Mbps&#xff0c;即200Mb/s&#xff0c;所以一秒钟可以下载200Mb的内容&#xff0c;根据1B8b的换算规则&#xff0c;所以200Mb200/8MB25MB。所以小蓝家的网络理论上每秒钟最多可以从网上下载25MB的内容。…

庄懂的TA笔记(十八)<特效:走马灯(序列帧) + 极坐标(UV转中心点)>

庄懂的TA笔记&#xff08;十八&#xff09;&#xff1c;特效&#xff1a;走马灯(序列帧) 极坐标(UV转中心点) 大纲&#xff1a; 一、走马灯&#xff1a;序列帧 双通道&#xff0c;双Pass 二、极坐标&#xff1a; 三、分享&#xff1a; 正文&#xff1a; 一、走马灯&#xff1a…

H3C交换机基于MAC的VLAN配置

配置需求或说明 1.1适用产品系列 本案例适用于如S7006、S7503E、S7506E、S7606、S10510、S10508等S7000、S7500E、S10500系列&#xff0c;且软件版本是V7的交换机 1.2配置需求及实现的效果 SWA和SWB的GE1/0/1分别连接两个会议室&#xff0c;PC1和PC2是会议用笔记本电脑&…

第八篇:强化学习值迭代及代码实现

你好&#xff0c;我是郭震&#xff08;zhenguo&#xff09; 前几天我们学习强化学习策略迭代&#xff0c;今天&#xff0c;强化学习第8篇&#xff1a;强化学习值迭代 值迭代是强化学习另一种求解方法&#xff0c;用于找到马尔可夫决策过程&#xff08;MDP&#xff09;中的最优值…

chatgpt赋能python:Python如何取两位小数?

Python如何取两位小数&#xff1f; 如果你是一个Python开发人员&#xff0c;想必你会遇到需要将数字取两位小数的情况。无论你是在处理金融数据&#xff0c;或者是在处理一些科学计算&#xff0c;都需要将结果保留到小数点后两位。在这篇文章中&#xff0c;我们将介绍如何在Py…

中国的互联网技术有多厉害?

1 很多人没有意识到&#xff0c;中国的互联网技术是相当厉害的。 给大家举几个例子。 我和朋友聊天的时候&#xff0c;手机上的app都在“侧耳倾听”&#xff0c;聊天的一些关键字很快就会出现在手机浏览器的搜索栏中。 携程会给我自动推荐景点&#xff0c;美团会给我推荐美食&…

大裁员继续,直到回归均值

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 关于裁员&#xff0c;不想再举个案&#xff0c;大家也都听烦了。还是给大家几个宏观数字吧。据专门追踪科技公司裁员人数的Layoffs.fyi网站统计&#xff0c;2023年以来&#xff0c;截至5月底&#xff…

chatgpt赋能python:Python断行:如何优雅地换行?

Python断行&#xff1a;如何优雅地换行&#xff1f; 简介 Python是一种直观、易于学习、优雅且精简的编程语言。但是&#xff0c;随着代码复杂度的增加&#xff0c;长行代码也变得越来越难以阅读。所以&#xff0c;如何正确地断行是编写整洁Python代码的关键之一。 为什么需…

Spark大数据处理学习笔记1.1 搭建Scala开发环境

文章目录 一、学习目标二、scala简介&#xff08;一&#xff09;Scala概述&#xff08;二&#xff09;函数式编程 三、windows上安装scala&#xff08;一&#xff09;到Scala官网下载Scala&#xff08;二&#xff09;安装Scala&#xff08;三&#xff09;配置Scala环境变量 四、…

前端——平台登录功能实战

这里写目录标题 一、登录界面1、新建LoginView.vue2、登录页面展示二、登录路由1、注册登录页面路由三、前端登录接口设计1、新建http.js2、新建user.js3、api.js四、登录页面调用登录接口五、前端配置路由守卫六、前端配置请求拦截器七、前端配置响应拦截器八、退出登录九、前…

简单易行的 Java 服务端生成动态 Word 文档下载

需求&#xff1a;某些合同&#xff0c;被制作成模板&#xff0c;以 Word 格式保存&#xff0c;输入相关的内容参数最终生成 Word 文档下载。这是企业级应用中很常见的需求。 解决方案&#xff1a;无非是模板技术&#xff0c;界定不变和变的内容&#xff0c;预留插值的标记&…

【最新计算机、电子毕业设计 本科 大专 设计+源码】

2022年 - 2023年 最新计算机、电子毕业设计 本科 大专 设计源码 下载前必看&#xff1a;纯小白教程&#xff0c;unity两种格式资源的使用方法&#xff0c;1打开现有项目、2导入package 大专毕设源码&#xff1a;数媒专业、计算机专业、电子专业通用50多款大专毕设小游戏【源码】…

一文说清Task及其调度问题

ask对于.NET的重要性毋庸置疑。通过最近的一些面试人员经历&#xff0c;发现很多人对与Task及其调度机制&#xff0c;以及线程和线程池之间的关系并没有清晰的认识。本文采用最简单的方式模拟了Task的实现&#xff0c;旨在说明Task是什么&#xff1f;它是如何被调度执行的&…