第十二届蓝桥杯C++青少年组中/高级组选拔赛2020年11月22日真题解析

news2024/11/27 20:22:46

一、编程题

第1题:求和

【题目描述】
输入一个正整数 N(N < 100),输出 1 到 N(包含 1 和 N)之间所有奇数的和。
【输入描述】
输入一个正整数 N(N < 100)
【输出描述】
输出 1 到 N 之间的所有奇数的和

【输入样例】

3

【输出样例】

4

答案:
参考代码一:

#include <iostream>
using namespace std;
int main() {
  int n;
  cin >> n;
  int sum = 0;
  for (int i = 1; i <= n; i++) {
    if (i % 2 == 1) {
      sum += i;
    }
  }
  cout << sum << endl;
  return 0;
}

参考代码二:

#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
  cin >> n;
  int sum = 0;
  for (int i = 1; i <= n; i += 2)
    sum += i;
  cout << sum;
  return 0;
}

本题属于简单题,考察累加器和循环的使用。定义累加器 sum 并初始化为 0,循环枚举i从1到 n,判断i如果为奇数,则累加 sum+=ì。循环结束后输出 sum。对循环理解较好的同学,也可以去掉 ǐ 判断,将 i++改为i+= 2,直接累加,也可达到奇数求和的效果。

第2题:求平方

【题目描述】
平方是一种运算,比如:a 的平方表示 a × a。
例如:2 的平方为 4(也就是 2*2 的积)
例如:4 的平方为 16(也就是 4*4 的积)
输入一个正整数 N(N < 30),输出 1 到 N(包含 1 和 N)之间所有正整数的平方,且所输出的平方数之间以英文逗号隔开。
【输入描述】
输入一个正整数 N(N < 30)
【输出描述】
输出所有正整数的平方数,以英文逗号隔开

【输入样例】

3

【输出样例】

1,4,9

答案:
参考代码一:

#include <iostream>
using namespace std;
int main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cout << i * i;
    if (i != n) {
      cout << ",";
    }
  }
  return 0;
}

参考代码二:

#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
  cin >> n;
  cout << "1";
  for (int i = 2; i <= n; i++)
    cout << ',' << i * i;
  return 0;
}

本题属于简单题,考察循环的使用。大部分失分的同学主要错在输出格式上。题目中要求输出时用英文逗号隔开,不能加空格或者使用中文逗号,并且最后一个平方数后面不能有英文逗号,因此在循环输出时,判断循环变量i,如果不是输出最后一个数,则输出英文逗号””,否则不输出。

第3题:数位递增数

【题目描述】
一个正整数如果任何一个数位小于等于右边相邻的数位,则称为一个数位递增数。
例如:
1135 是一个数位递增数
1024 不是一个数位递增数
输入一个正整数 n(11<n<10001),输出 11 到 n(包含11和n)中有多少个数位递增数。
例如:输入 15,11 到 15 之间的数位递增数有:11、12、13、14、15。一共有 5 个。
【输入描述】
输入一个正整数 n(11<n<10001)
【输出描述】
输出 11 到 n 中有多少个数位递增数

【输入样例】

15

【输出样例】

5

答案:
参考代码一:

#include <iostream>
using namespace std;
int main() {
  int n;
  cin >> n;
  int cnt = 0;
  for (int i = 11; i <= n; i++) {
    int a = i / 10000 % 10; // 万位
    int b = i / 1000 % 10;  // 千位
    int c = i / 100 % 10;   // 百位
    int d = i / 10 % 10;    // 十位
    int e = i % 10;         // 个位
    if (a <= b && b <= c && c <= d && d <= e) {
      cnt++;
    }
  }
  cout << cnt << endl;
  return 0;
}

参考代码二:

#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
  cin >> n;
  int sum = 0;
  for (int i = 11; i <= n; i++) {
    string s;
    stringstream ss;
    ss << i;
    ss >> s;
    int f = 0;
    for (int j = 1; j <= s.size() - 1; j++)
      if (s[j] < s[j - 1]) {
        f = 1;
        break;
      }
    if (!f)
      sum++;
  }
  cout << sum;
  return 0;
}

本题与之前课上所做的水仙花数、四叶玫瑰数类似,考察循环枚举与数位分离的技巧。
题目中的数据范围为 11~10001,即最少为2位,最多为5位。由题意可知,一个数位递增数,在高位补0后,不会改变数的大小且仍为数位递增数。不妨在高位补 0,将所有的数当做五位数处理。例如,11、12 是数位递增数,处理时看做 00011、00012,仍为数位递增数。补齐五位后,使用数位分离的技巧,依次取出万位 a、千位 b、百位 c、十位 d、个位 e,判断是否高位数字<= 低位数字,如果是数位递增数,则计数器 cnt++,循环结束后输出 cnt,程序结束.

第4题:最短距离

【题目描述】
有一个居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为 1,2,3……,当排满一行时,从下一行相邻的楼往反方向排号。
例如:小区为 3 行 6 列,矩阵排列方式:
在这里插入图片描述

要求:已知小区楼房有 w 列及两个楼房楼号 m 和 n,求从 m 号楼到 n 号楼之间的最短路线经过几个楼(不能斜线方向移动)。
例如上图:当 w=6,m=8,n=2,从 8 号楼到 2 号楼最短的路线经过 5,4,3,2 四个楼(9,10,11,2 也经过四个楼),故最短路线为 4(注:不考虑路线只考虑最短路线经过几个楼)。
输入三个正整数 w(1<w<21),m(1<m<10001),n(1<n<10001),且 m 不等于n。三个正整数之间以一个空格隔开,输出m 到n的最短路线经过几个楼。
【输入描述】
在一行输入三个正整数 w,m,n,三个正整数之间以一个空格隔开
【输出描述】
输出 m 到 n 的最短路线经过几个楼
【输入样例】

6 8 2

【输出样例】

4

答案:
参考代码一:

#include <cmath>
#include <iostream>

using namespace std;
int main() {
  int w, m, n;
  cin >> w >> m >> n;
  int x1, y1, x2, y2;
  x1 = (m - 1) / w + 1;
  y1 = (m - 1) % w + 1;
  if (x1 % 2 == 0) {
    y1 = w + 1 - y1;
  }
  x2 = (n - 1) / w + 1;
  y2 = (n - 1) % w + 1;
  if (x2 % 2 == 0) {
    y2 = w + 1 - y2;
  }
  int ans = abs(x1 - x2) + abs(y1 - y2);
  cout << ans << endl;
  return 0;
}

参考代码二:

#include <bits/stdc++.h>
using namespace std;
int n, m, w, a[1011][1011], s1, t1, s2, t2;
int main() {
  cin >> w >> n >> m;
  int x = 1, y = 1, f = 0;
  if (n > m)
    swap(n, m);
  for (int i = 1; i <= m; i++) {
    a[x][y] = i;
    if (i == n)
      s1 = x, t1 = y;
    if (i == m)
      s2 = x, t2 = y;
    if (f == 0)
      y++;
    else
      y--;
    if (y > w) {
      x++;
      y = w;
      f = 1;
    }
    if (y < 1) {
      x++;
      y = 1;
      f = 0;
    }
  }
  cout << abs(s2 - s1) + abs(t2 - t1);
  return 0;
}

本题重点考察题目分析和理解。我们需要计算出 m、n 号楼在第几行第几列,行、列的差相加,得到最终的结果。
例如,w=6,m=8,n=2,可以算得8号楼所在行x1=(m-1)/w+1=(8-1)16+1=2,2号楼所在行x2=(n-1)/w+1=(2-1)16+1=1:
所在列的情况比较复杂,涉及反向的问题,其中奇数行的列号从左往右依次增大,偶数行的列号从左往右依次减小,我们可以先按照从左往右依次增大的情况,算出y1=(m-1)%w+1=(8-1)%6+1=2,y2=(n-1)%w+1=(2-1)%6+1=2:
其中,2号楼在奇数行,y2=2即为所在列,8号楼在偶数行,方向相反,y1=w+1-y1=6+1-2=5,8号楼在第5列。
经过的楼数为 abs(x1-x2)+abs(y1-y2)=abs(2-1)+ abs(5-2)= 4.
将如上过程编写为程序,输出即可。

第5题:组合

【题目描述】
输入两个正整数 n 和 m(20 >= m >= n > 0),n 代表正整数的个数,要求 n 个正整数相加的和为 m,输出满足这个条件的正整数组合有多少。
例如:当 n=4,m=8 时,满足条件的有 5 组(也就是:5+1+1+1=8,4+2+1+1=8,3+3+1+1=8,3+2+2+1=8,2+2+2+2=8,每组组合都由 4 个正整数组成且 4 个正整数的和等于 8)
【输入描述】
分行输入 n 和 m(20>=m>=n>0)
【输出描述】
输出满足这个条件的正整数组合有多少
【输入样例】

4
8

【输出样例】

5

答案:
参考代码一:

#include <iostream>
using namespace std;
int n, m, sum = 0, ans = 0;
int a[25];
void dfs(int p) {
  if (p > n) {
    if (sum == m) {
      ans++;
    }
    return;
  }
  for (int i = a[p - 1]; i <= m - sum; i++) {
    sum += i;
    a[p] = i;
    dfs(p + 1);
    sum -= i;
    a[p] = 0;
  }
}
int main() {
  cin >> n >> m;
  a[0] = 1;
  dfs(1);
  cout << ans << endl;
  return 0;
}

参考代码二:

#include <bits/stdc++.h>
using namespace std;
int n, m, a[110], ans;
void dfs(int dps, int sum) {
  if (sum > m)
    return;
  if (dps > n) {
    if (sum == m)
      ans++;
  } else {
    for (int i = 1; i <= m; i++) {
      if (i >= a[dps - 1]) {
        a[dps] = i;
        dfs(dps + 1, sum + i);
        a[dps] = 0;
      }
    }
  }
  return;
}
int main() {
  cin >> n >> m;
  dfs(1, 0);
  cout << ans;
  return 0;
}

做法1使用递归回溯法,设数组 a[25],a[p] 表示式子中的第 p 个加数。
设初始值 a[0]= 1,依次递归枚举 a[1]~ a[n],为了避免重复枚举,a[p]的枚举范围为 a[p-1]~(m- sum)。
计算 a[1] ~ a[n] 总和 sum,如果 sum == m,则个数 ans++。
递归结束,输出符合条件的个数 ans。

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

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

相关文章

Llama模型家族之拒绝抽样(Rejection Sampling)(九) 强化学习之Rejection Sampling

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

利用streamlit结合langchain_aws实现claud3的页面交互

测试使用的代码如下 import streamlit as st from langchain_aws import ChatBedrockdef chat_with_model(prompt, model_id):llm ChatBedrock(credentials_profile_name"default", model_idmodel_id, region_name"us-east-1")res llm.invoke(prompt)re…

UiPath发送邮件给多人时需要注意哪些限制?

UiPath发送邮件给多人的步骤&#xff1f;如何使用UiPath发信&#xff1f; 尽管UiPath提供了强大的邮件发送功能&#xff0c;但在批量发送邮件时&#xff0c;有一些限制和注意事项是我们必须了解的。AokSend将详细介绍这些限制&#xff0c;并提供一些优化建议。 UiPath发送邮件…

视频监控管理平台LntonCVS视频汇聚平台充电桩视频监控应用方案

随着新能源汽车的广泛使用&#xff0c;公众对充电设施的安全性和可靠性日益重视。为了提高充电桩的安全管理和站点运营效率&#xff0c;LntonCVS公司推出了一套全面的新能源汽车充电桩视频监控与管理解决方案。 该方案通过安装高分辨率摄像头&#xff0c;对充电桩及其周边区域进…

纷享销客安全体系:安全合规认证

安全合规认证是指组织通过独立的第三方机构对其信息系统和数据进行评估和审查&#xff0c;以确认其符合相关的安全标准、法律法规和行业要求的过程。 安全合规认证可以帮助组织提高信息系统和数据的安全性&#xff0c;并向客户、合作伙伴和监管机构证明其符合相关的安全标准和…

python协程入门实战详解

本章将以通俗易懂、贴合实际的方式介绍以下内容&#xff1a; 协程是什么&#xff0c;有什么特点&#xff0c;协程的优势是什么如何理解事件和事件循环协程的创建方式&#xff0c;如何控制协程的并发量在协程中使用aiohttp发送HTTP请求aiohttp案例协程中的异常处理&#xff0c;…

如何使用Python的Turtle模块绘制小猪

一、前置条件 在开始学习如何使用Python的Turtle模块进行绘画之前&#xff0c;请确保你的电脑已安装Python环境。如果尚未安装Python&#xff0c;你可以从Python官网下载并安装最新版本。 Turtle模块是Python内置的一个用于绘图的库&#xff0c;通常不需要额外安装。如果你发…

使用 Ollama 和 Open WebUI 自托管 LLM 聊天机器人(无需 GPU)

✨点击这里✨&#xff1a;&#x1f680;原文链接&#xff1a;&#xff08;更好排版、视频播放、社群交流、最新AI开源项目、AI工具分享都在这个公众号&#xff01;&#xff09; 使用 Ollama 和 Open WebUI 自托管 LLM 聊天机器人&#xff08;无需 GPU&#xff09; &#x1f31…

linux指令--sed

sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 语法解析 sed [选项] 编辑命令 文件 选项&#xff1a; -n&#xff1a;只显示匹配处理的行-e&#xff1a;执行多个编辑命令时-i&#xff1a;在原文件中进行修改&#xff0c;不输出到屏幕-…

Windows下对于Qt中带 / 的路径的处理

在Windows下&#xff0c;如果你想使用操作系统的分隔符显示用户的路径&#xff0c;请使用 toNativeSeparators()。 请看以下代码&#xff1a; void Player::on_playBtn_clicked() {if (this->m_url.isEmpty()) {openMedia();if (this->m_url.isEmpty())return;}qDebug(…

机器学习作业6——svm支持向量机

目录 一、理论 概念&#xff1a; 线性可分&#xff1a; 支持向量&#xff1a; 间隔&#xff1a; 目标&#xff1a; 软间隔&#xff1a; 梯度下降法&#xff1a; 别的方法&#xff1a; 拉格朗日函数&#xff1a; SMO算法&#xff1a; 核函数&#xff1a; 二、代码 …

数据结构之ArrayList与顺序表(下)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 ArrayList的具体使用 118. 杨辉三角 扑克洗牌算法 接上篇&#xff1a;数据结构之ArrayLis…

三端植物大战僵尸杂交版来了

Hi&#xff0c;好久不见&#xff0c;最近植物大战僵尸杂交版蛮火的 那今天苏音整理给大家三端的植物大战僵尸杂交版包括【苹果端、电脑端、安卓端】 想要下载的直接划到最下方即可下载。 植物大战僵尸&#xff0c;作为一款古老的单机游戏&#xff0c;近期随着B站一位UP主潜艇…

英伟达黄仁勋最新主题演讲:“机器人时代“已经到来

6月2日&#xff0c;英伟达联合创始人兼首席执行官黄仁勋在Computex 2024&#xff08;2024台北国际电脑展&#xff09;上发表主题演讲&#xff0c;分享了人工智能时代如何助推全球新产业革命。 黄仁勋表示&#xff0c;机器人时代已经到来&#xff0c;将来所有移动的物体都将实现…

开源与新质生产力

在这个信息技术迅猛发展的时代&#xff0c;全球范围内的产业都在经历着深刻的变革。在这样的背景下&#xff0c;“新质生产力”的概念引起了广泛的讨论。无论是已经成为或正努力转型成为新质生产力的企业&#xff0c;都在寻求新的增长动力和竞争优势。作为一名长期从事开源领域…

什么是2+1退休模式?什么是链动2+1模式?

21退休模式又称链动21模式&#xff0c;主要是建立团队模式&#xff0c;同时快速提升销量。是目前成熟模式中裂变速度最快的模式。21退休模式合理合规&#xff0c;同时激励用户公司的利润分享机制&#xff0c;让您在享受购物折扣的同时&#xff0c;也能促进并获得客观收益。 模…

kettle从入门到精通 第六十六课 ETL之kettle kettle阻塞教程,轻松获取最后一行数据,so easy

场景:ETL沟通交流群内有小伙伴反馈,如何在同步一批数据完成之后记录下同步结果呢?或者是调用后续步骤、存储过程、三方接口等。 解决:使用步骤Blocking step进行阻塞处理即可。 1、下面的demo演示从表t1同步数据至表t2(t1表中有三条数据,t2为空表,两个表表结构相同),…

Plotly : 超好用的Python可视化工具

文章目录 安装&#xff1a;开始你的 Plotly 之旅基本折线图&#xff1a;简单却强大的起点带颜色的散点图&#xff1a;数据的多彩世界三维曲面图&#xff1a;探索数据的深度气泡图&#xff1a;让世界看到你的数据小提琴图&#xff1a;数据分布的优雅展现旭日图&#xff1a;分层数…

Vue学习day05笔记

day05 一、学习目标 1.自定义指令 基本语法&#xff08;全局、局部注册&#xff09;指令的值v-loading的指令封装 2.插槽 默认插槽具名插槽作用域插槽 3.综合案例&#xff1a;商品列表 MyTag组件封装MyTable组件封装 4.路由入门 单页应用程序路由VueRouter的基本使用 …

认识Java中的String类

前言 大家好呀&#xff0c;本期将要带大家认识一下Java中的String类&#xff0c;本期注意带大家认识一些String类常用方法&#xff0c;和区分StringBuffer和StringBuilder感谢大家收看 一&#xff0c;String对象构造方法与原理 String类为我们提供了非常多的重载的构造方法让…