<蓝桥杯软件赛>零基础备赛20周--第5周--杂题-2

报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集
20周的完整安排请点击:20周计划
每周发1个博客,共20周(读者可以按自己的进度选“正常”和“快进”两种计划)。
每周3次集中答疑
,周三、周五、周日晚上,在QQ群上答疑:

在这里插入图片描述

文章目录

  • 0. 上周答疑
  • 1. 精讲题
    • 1.1 修剪灌木
    • 1.2 英文数字计数
    • 1.3 矩形拼接
    • 1.4 最少砝码
    • 1.5 蜂巢
    • 1.6 立方体表面距离
  • 2. 刷题

第 4周:  杂题-2

0. 上周答疑

  伪代码怎么转化Java语言?
  C/C++、Java、Python代码怎么互转?
  回答:用大数据模型转,例如文心一言3.5,是免费的。
  在转换代码这件事上,大数据模型做得很好。
在这里插入图片描述

1. 精讲题

  本周还是杂题!
  大家是不是感到太慢了,什么时候才学数据结构、算法呢?我想立刻现在马上学:二分、排序、二叉树、DFS、…
  不要着急,杂题做得越多,后面的学习越高效越快!
  一是提高编码能力!争取做到:一次写20行代码,不用调试一次过!
  二是算法能力!杂题虽然没用到经典算法,但它们的解题步骤其实也是算法,有时难度不亚于经典算法。
  下面给出6个精讲题,有模拟、构造、思维、数学等各种杂题,难度从简单到难。大家自己先做,然后再看题解。

1.1 修剪灌木

难度 **
2022年第十三届省赛:链接1-蓝桥OJ 、链接2-NewOj
题解】这是一道思维题。由于每棵灌木都会在2N天内被剪为0,所以不会无限长高。其中的第i棵,它左边有i-1棵,右边有n-i棵。爱丽丝分别从左右绕回来,各需要2i和2(n-i-1)天,取最大值就是高度。i从0开始。
(1)C/C++代码

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

(2)python代码

n = int(input())
for i in range (n): print(max(i,n-i-1)*2)

(3)java代码

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            System.out.println(Math.max(i, n - i - 1) * 2);
        }
    }
}

1.2 英文数字计数

见博客:英文数字计数
难度 ***

1.3 矩形拼接

2022年第十三届省赛: 链接-NewOJ
难度 *** 准确地说,难度有3.5颗星
题解】本题是一道纯粹的构造题,思维简单,但是代码比较繁琐细致,目的是考核编码能力。
  3个矩形摆在一起,可能有几个边?读者可以在纸上手画观察,如果3个矩形完全不能匹配,是8边形;如果能完全匹配成一个新矩形,是4边形;其他情况是6边形。
  本题只有3个矩形,并不复杂。3个矩形做任意组合,每个矩形有横竖两种摆法,共48种情况。T = 1000组测试,总计算量是1000×48,计算量很小不会超时,所以简单地用暴力法组合出所有情况,取最小值即可。
(1)C/C++代码
  下面的C++代码,第10 ~ 14行,对3个矩形进行组合。第15 ~ 17行,每个矩形有横和竖两种摆法。
  第18行,如果一个矩形的边长等于另外两个矩形边长之和,那么至少是6个边。然后第20行,如果这两个矩形边长相等,那么就是4个边。后面几行请自己分析。

#include<bits/stdc++.h>
using namespace std;
int a[3][2];
int main(){
    int T;    cin >> T;
    while(T--)    {
        for(int i = 0; i < 3; i++)
            cin >> a[i][0] >> a[i][1];
        int ans = 8;
        for(int i = 0; i < 3; i++)               //第1个矩形
            for(int j = 0; j < 3; j++)
                if(i != j)                       //第2个矩形
                    for(int k = 0; k < 3; k++)
                        if(k != i && k != j)     //第3个矩形
                            for(int ii = 0; ii <= 1; ii++){           //第1个有横竖两种摆法
                                for(int jj = 0; jj <= 1; jj++){       //第2个横竖摆
                                    for(int kk = 0; kk <= 1; kk++){   //第3个横竖摆
                                        if(a[i][ii] == a[j][jj] + a[k][kk]){ 
                                            ans = min(ans, 6);
                                            if(a[j][1-jj] == a[k][1-kk])
                                                ans = min(ans, 4);
                                        }
                                        if(a[i][ii] == a[j][jj] || a[j][jj] == a[k][kk])
                                            ans = min(ans, 6);
                                        if(a[i][ii] == a[j][jj] && a[j][jj] == a[k][kk])
                                            ans = min(ans, 4);
                                    }
                                }
                            }
        cout<<ans<<endl;
    }
    return 0;
}

(2)python代码

def check1(x1,x2,x3):
    if x1>=x2 and x1>=x3:
        if x1==x2+x3 and a[2]+a[3]-x2==a[4]+a[5]-x3:  return True
    if x2>=x1 and x2>=x3:
        if x2==x1+x3 and a[0]+a[1]-x1==a[4]+a[5]-x3:  return True
    if x3>=x1 and x3>=x2:
        if x3==x1+x2 and a[0]+a[1]-x1==a[2]+a[3]-x2:  return True
    return False
def check2(x1,x2,x3):
    if x1>=x2 and x1>=x3:
        if x1==x2+x3:    return True
    if x2>=x1 and x2>=x3:
        if x2==x1+x3:    return True
    if x3>=x1 and x3>=x2:
        if x3==x1+x2:    return True
    return False
     
T = int(input())
for t in range(T):
    a=list(map(int,input().split()))
    ans=8
    for i in range(0,2):              #第1个矩形
        for j in range(2,4):          #第2个矩形
            for k in range(4,6):      #第3个矩形
                x1,x2,x3 = a[i],a[j],a[k]
                if x1==x2 and x2==x3:          ans = min(ans,4)
                if check1(x1,x2,x3):           ans = min(ans,4)
                if x1==x2 or x1==x3 or x2==x3: ans = min(ans,6)
                if check2(x1,x2,x3):           ans = min(ans,6)
    print(ans)

(3)java代码

import java.util.*;
import java.io.*; 
public class Main { 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();
        for(int _t = 1; _t <= T; _t++){
            int[][] a = new int[3][2];
            int ans = 8;
            for(int i = 0; i < 3; i++) {
                a[i][0] = in.nextInt();
                a[i][1] = in.nextInt();
            }
            //枚举第一个矩形下标为i,第二个矩形下标为j,第三个矩形下标为k
            for(int i = 0; i < 3; i++)
                for(int j = 0; j < 3; j++)
                    if(i != j)
                        for(int k = 0; k < 3; k++)
                            if(i != k && j != k)
                            //枚举三个矩形的两条边
                                for(int ii = 0; ii <= 1; ii++)
                                    for(int jj = 0; jj <= 1; jj++)
                                        for(int kk = 0; kk <= 1; kk++) {
                                            if(a[i][ii] == a[j][jj])//6条边的情况1
                                                ans = Math.min(ans, 6);
                                            if(a[i][ii] == a[j][jj] && a[i][ii] == a[k][kk])//4条边的情况1
                                                ans = Math.min(ans, 4);
                                            //枚举仅考虑a[i][ii] 与 a[j][jj] + a[k][kk]的关系
                                            if(a[i][ii] == a[j][jj] + a[k][kk])  {
                                                ans = Math.min(ans, 6);     //6条边的情况2
                                                if(a[j][1 - jj] == a[k][1 - kk])    //4条边的情况2
                                                    ans = Math.min(ans, 4);
                                            }
                                    }
            System.out.println(ans);
        }
    }
}

1.4 最少砝码

2021年第十二届蓝桥杯省赛: 链接1-蓝桥OJ
难度 ***
题解】这是一道找规律题。
  题目要求给出最少数量的几个整数(砝码),通过加减组合得到1 ~ N的整数。熟悉二进制的都知道,用1、2、4、8、16、…这些2的倍数,可以组合后相加得到任意整数。不过,本题的砝码不仅可以相加,还可以放在天平的两边通过减法得到新的称重。例如N = 3时,砝码可以是{1, 2},也可以是{1, 3}、{2, 3}。
  本题的思维有一点难度,读者如果自己提前做了此题,思维过程可能比较繁琐。下面给出一种简洁的推理方法。
  设当前砝码称重范围是1 ~ R。加一个砝码w,并且要求不重复加w前已经能得到的称重,那么w将是一个很大的砝码。新的称重范围是:
    {1, 2, …, R, w-R, w-R+1,…, w, w+1, w+2, …, w+R}
  因为从R到w-R是连续的,所以有w-R = R+1,即w = 2R+1。也就是说,如果当前称重范围是1 ~ R,那么加一个w = 2R+1的砝码,可以扩展到新的称重范围R’= w+R = 3R+1。
  下面列表计算,每一行的“原砝码,原称重范围”是上一行的“新砝码,新称重范围”。
在这里插入图片描述
  这个表格给出了一种最少砝码的实现方式,虽然可能有其他实现方式,但这种实现方式最大程度扩展了新的R’,是一种最优方案。
  根据这个表格可以得到计算方法:(1)砝码按3的倍数增长;(2)每加一个砝码,称重范围增长到R’ = 3R+1。
  R按3倍增长,这比二进制的倍增还快,当N = 1 0 9 10^9 109时,计算量 l o g 3 N log_3N log3N < l o g 2 N log_2N log2N = 30。

(1)C/C++代码

#include <stdio.h>
int main() {
    int N;
    scanf("%d", &N);
    int R = 1;
    int cnt = 1;
    while (R < N) {
        R = R * 3 + 1;
        cnt++;
    }
    printf("%d", cnt);
    return 0;
}

(2)python代码

N = int(input())
R = 1 
cnt = 1
while R < N:
    R = R*3 + 1
    cnt += 1
print(cnt)

(3)java代码

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int R = 1;
        int cnt = 1;
        while (R < N) {
            R = R * 3 + 1;
            cnt++;
        }
        System.out.println(cnt);
    }
}

1.5 蜂巢

2022年第十三届省赛: [链接1-蓝桥OJ]
难度 ****
题解】本题是一道构造题,考点有两个:坐标转换、距离计算。
  蜂巢有6个方向,看起来比较复杂,但实际上走步非常简单,例如样例中从B走到C,C在B的右下方,B只要一直向右向下走,且不超过C的行和列,不管怎么走,一定能以最小步数走到C。
  本题的难点是对坐标的处理。如果是简单的直角坐标系,很容易计算。本题是六角形的蜂巢,每个蜂巢的中心点是否能转为直角坐标?把蜂巢的关系用下面的直角坐标表示:
在这里插入图片描述
  中心点O,对应的6个蜂巢的坐标分别为(-2, 0)、(-1, 1)、(1, 1)、(2, 0)、(1, -1)、(-1, -1),下面代码中用xdir[]、ydir[]表示。
  先计算得到起点坐标(x1, y1)、终点坐标(x2, y2)。如何计算起点到终点的步数?由于蜂巢的坐标比较奇怪,不能直接用“曼哈顿距离[ 曼哈顿距离,又称为出租车距离:两点的距离等于x方向上的距离加上y方向上的距离,即|x1-x2| + |y1-y2|。]”计算。读者如果已经做了这一题,可能是用各种复杂的判断来计算的。下面给出一个简单巧妙的方法。
  坐标之差的绝对值dx = |x1-x2|,dy = |y1-y2|,有以下结论:
  1、若dx ≥ dy,那么最少步数是(dx+dy)/2,即先横着走,再斜着走;
  2、若dx < dy,一直斜着走就行,最少步数是dy。

(1)C/C++代码
  代码中有一个地方需要注意,即坐标值应该用long long,如果用int会溢出。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll xdir[] = {-2,-1,1,2, 1,-1};  //横向
ll ydir[] = { 0, 1,1,0,-1,-1};  //纵向
void walk(ll d, ll q, ll &x, ll &y){
    x += xdir[d] * q;
    y += ydir[d] * q;           //引用传参,返回坐标值(x,y)
}
int main(){
    ll d1,p1,q1,d2,p2,q2;
    cin>>d1>>p1>>q1>>d2>>p2>>q2;
    ll x1 = 0, y1 = 0;           //计算起点坐标(x1, y1)
    walk(d1,p1,x1,y1);           //先走第1个方向
    walk((d1 + 2) % 6,q1,x1,y1); //再走第2个方向
    ll x2 = 0, y2 = 0;           //计算终点坐标(x2, y2)
    walk(d2,p2,x2,y2);
    walk((d2 + 2) % 6,q2,x2,y2);
    ll dx = abs(x1 - x2), dy = abs(y1 - y2);
    if (dx >= dy) cout << (dx+dy)/2;      //先横走,再斜着走
    else          cout << dy;              //一直斜着走就行了
}

(2)python代码

xdir = [-2,-1,1,2, 1,-1]
ydir = [ 0, 1,1,0,-1,-1]
def walk(d, q,x,y):  
    x += xdir[d]*q
    y += ydir[d]*q
    return x,y
d1,p1,q1,d2,p2,q2 = map(int,input().split())
x1, y1 = walk(d1,p1,0,0)
x1, y1 = walk((d1 + 2) % 6, q1,x1,y1)
x2, y2 = walk(d2,p2,0,0)
x2, y2 = walk((d2 + 2) % 6, q2,x2,y2)
dx,dy = abs(x1 - x2), abs(y1 - y2);
if (dx >= dy): print((dx+dy)//2)     #先横走,再斜着走
else:          print(dy)             #一直斜着走 

(3)java代码

import java.util.*;
public class Main {
    static long[] xdir = {-2, -1, 1, 2, 1, -1}; //横向
    static long[] ydir = {0, 1, 1, 0, -1, -1}; //纵向
    static void walk(int d, long q, long[] pos) {
        pos[0] += xdir[d] * q;
        pos[1] += ydir[d] * q;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int d1 = scanner.nextInt();
        long p1 = scanner.nextLong();
        long q1 = scanner.nextLong();
        int d2 = scanner.nextInt();
        long p2 = scanner.nextLong();
        long q2 = scanner.nextLong();
        long[] pos1 = {0, 0};
        walk(d1, p1, pos1);
        walk((d1 + 2) % 6, q1, pos1);
        long[] pos2 = {0, 0};
        walk(d2, p2, pos2);
        walk((d2 + 2) % 6, q2, pos2);
        long dx = Math.abs(pos1[0] - pos2[0]);
        long dy = Math.abs(pos1[1] - pos2[1]);
        if (dx >= dy)  System.out.println((dx + dy) / 2);
        else           System.out.println(dy);        
    }
}

1.6 立方体表面距离

见博客:立方体表面距离
难度 *****

2. 刷题

  还是继续刷题吧。上周的题目链接,大家接着做:

  蓝桥题库的模拟题-简单
  蓝桥题库的模拟题-中等
  蓝桥题库的模拟题-困难

  蓝桥题库的枚举题-简单
  蓝桥题库的枚举题-中等
  蓝桥题库的枚举题-困难

  蓝桥题库的递归题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java,多线程,线程的两种创建方式

首先是多线程的一些相关概念&#xff1a; 相关概念&#xff1a; 程序&#xff08;program&#xff09;&#xff1a;为完成特定任务&#xff0c;用某种语言编写的一组指令的集合。即指一段静态&#xff08;指不在执行中&#xff09;的代码。 进程&#xff08;process&#xf…

Qt QTableWidget表格的宽度

默认值 QTableWIdget的表格宽度默认是一个给定值&#xff0c;可以手动调整每列的宽度&#xff0c;也不填满父窗口 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {this->resize(800,600);QStringList contents{"11","111111111111",&…

聊聊模板引擎<Template engine>

模板引擎是什么 模板引擎是一种用于生成动态内容的工具&#xff0c;通常用于Web开发中。它能够将静态的模板文件和动态数据结合起来&#xff0c;生成最终的HTML、XML或其他文档类型。模板引擎通过向模板文件中插入变量、条件语句、循环结构等控制语句&#xff0c;从而实现根据…

操作系统:输入输出管理(一)系统概述与设备独立性软件

一战成硕 5.1 I/O系统概述5.1.1 I/O设备5.1.2 I/O控制方式5.1.3 I/O软件层次结构5.1.4 应用程序的I/O接口 5.2 设备独立性软件5.2.1 与设备无关的软件5.2.2 高速缓存与缓冲区5.2.3 设备分配与回收5.2.4 spooling技术&#xff08;假脱机技术&#xff09; 5.1 I/O系统概述 5.1.1…

一分钟秒懂人工智能对齐

文章目录 1.什么是人工智能对齐2.为什么要研究人工智能对齐3.人工智能对齐的常见方法 1.什么是人工智能对齐 人工智能对齐&#xff08;AI Alignment&#xff09;指让人工智能的行为符合人的意图和价值观。 人工智能系统可能会出现“不对齐”&#xff08;misalign&#xff09;…

【EI会议征稿】JPCS独立出版-第五届新材料与清洁能源国际学术会议(ICAMCE 2024)

JPCS独立出版-第五届新材料与清洁能源国际学术会议&#xff08;ICAMCE 2024&#xff09; 2024 5th International Conference on Advanced Material and Clean Energy 第五届新材料与清洁能源国际学术会议&#xff08;ICAMCE 2024&#xff09;将于2024年2月23-25日在中国▪长沙…

电机应用-无刷直流电机

无刷直流电机 无刷直流电机&#xff08;Brushless Dirent Current Motor&#xff0c;简称BLDCM&#xff09;由电动机主体和驱动器组成&#xff0c;无电刷和无换向器&#xff0c;是除了有刷电机外用得最多的一种电机。 无刷直流电机不使用机械的电刷装置&#xff0c;采用方波自控…

带你一分钟看懂 “kubernetes”

目录 什么是 Kubernetes Kubernetes 概述 为什么需要 Kubernetes&#xff0c;它能做什么&#xff1f; 什么是 Kubernetes 从官方网站上可以看到&#xff0c;它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语&#xff0c;它的中文翻译是“舵手”或者“飞行员”。在…

NFT Insider112:Gucci Cosmos LAND亮相 The Sandbox,和YGG一起探索Web3增长新方式

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members(https://twitter.com/WHALEMembers)、BeepCrypto&#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周…

0基础制作产品图册的干货,一个网站即可

很多朋友想要制作产品图册&#xff0c;但是不知道如何入手&#xff0c;其实制作产品图册并不难&#xff0c;一个网站就可以搞定。下面就为大家分享一些干货&#xff0c;帮助大家快速入门。 首先&#xff0c;我们需要选择一个合适的网站。比如FLBOOK在线制作电子杂志平台。这个网…

【chat】3: ubutnu 安装mysql-8

如何在 Ubuntu 20.04 上安装 MySQLC搭建集群聊天室&#xff08;七&#xff09;&#xff1a;MySQL数据库配置 及项目工程目录配置 大神是centos的. apt 安装 rootk8s-master-2K4G:~# sudo apt install mysql-server Reading package lists... Done Building dependency tree Re…

SQL触发器

触发器是与表有关的数据库对象。 在insert/update/delete之前(BEFORE)或之后(AFTER)&#xff0c;触发并执行触发 器中定义的SQL语句集合。 触发器的这种特性可以协助应用在数据库端确保数据的完整性, 日志记录 , 数据校验等操作 。 使用别名OLD和NEW来引用触发器中发生变化的…

Google play提高上包率——如何防止封号、拒审、下架?

Google Play是全球最大的移动应用商店之一&#xff0c;它是运行Android操作系统的设备的官方应用商店。它提供各种数字内容&#xff0c;包括应用程序&#xff08;应用&#xff09;、游戏、音乐、书籍等&#xff0c;包括免费和付费选项。这也为许多游戏/APP出海的企业或开发者提…

国内首批!华为云云原生中间件DCSDMS获软件可信“卓越级”认证

11月6日&#xff0c;在软件供应链可信研讨大会上&#xff0c;工业和信息化部电子第五研究所&#xff08;以下简称“电子五所”&#xff09;发布了首批软件产品可信评估结果&#xff0c;并为通过评估的企业颁发证书。 华为云作为中国领先的综合云计算服务商受邀参加本次大会&…

【星海随笔】git的使用

1.在终端&#xff0c;检查git是否安装 git --version 2.没有安装的话去&#xff0c;官网&#xff0c;下载git 3.一直点下一步即可 4.安装后在终端检查git是否安装好 5.设置用户名和邮件地址(最好和GitHub的用户名/邮箱保持一致) git config --global user.name “自己的用户名”…

建表时如何合理选择字段类型

前言 我们在建表的时候关于字段类型的选择会有这么几类人&#xff1a; 严谨型 严格调研每个字段可能的大小&#xff0c;然后根据不同字段类型的限制&#xff0c;进行选择&#xff0c;这一类人在创建关系型数据表的时候是没有问题的。图自己省事型 把所有字段都设置为String&a…

100 寻找重复数

寻找重复数 题解1 二分法题解2 快慢指针(同环形链表2(ab)(ab)kL) 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返…

使用Pytorch的一些小细节(一)

文章目录 前言数据结构-张量max函数索引函数赋值函数拼接函数 前言 由于不经常动手写代码&#xff0c;所以对于python语言中的常见数据结构的用法也不是很熟悉&#xff0c;对于pytorch中的数据结构就更加不熟悉了。之前的代码基础是基于C语言的&#xff0c;属性都是自己定义&a…

动态规划-构建乘积数组

** 描述 给定一个数组 A[0,1,…,n-1] ,请构建一个数组 B[0,1,…,n-1] ,其中 B 的元素 B[i]A[0]A[1]…*A[i-1]A[i1]…*A[n-1]&#xff08;除 A[i] 以外的全部元素的的乘积&#xff09;。程序中不能使用除法。&#xff08;注意&#xff1a;规定 B[0] A[1] * A[2] * … * A[n-1…

量子计算和量子通信技术:引领潜力无限的未来

近年来&#xff0c;随着量子计算和量子通信技术的迅速发展&#xff0c;它们在各个领域的广泛应用前景引起了人们的极大兴趣。本文将深入探讨量子计算和量子通信技术的普遍应用&#xff0c;以及它们预示的未来&#xff0c;同时提出业内人士需要注意的事项。 介绍&#xff1a;量子…