【算法】2022年第十三届蓝桥杯大赛软件类省赛Java大学C组真题

【算法】2022年第十三届蓝桥杯大赛软件类省赛Java大学C组真题

 个人主页:NiKo

算法专栏:算法设计与分析


目录

题目 2680:纸张尺寸 

题目 2664:求和

题目 2681: 矩形拼接

题目 2665: 选数异或

题目 2682: GCD

题目 2667: 青蛙过河

题目 2683: 因数平方和

题目 2668: 最长不下降子序列


题目 2680:纸张尺寸 

  • 题目描述        在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm × 841mm,将 A0 纸沿长边对折后为 A1 纸,大小为 841mm × 594mm,在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸,依此类推。 输入纸张的名称,请输出纸张的大小。
  • 输入格式        输入一行包含一个字符串表示纸张的名称,该名称一定是 A0、A1、A2、A3、A4、A5、A6、A7、A8、A9 之一。 
  • 输出格式        输出两行,每行包含一个整数,依次表示长边和短边的长度。
  • 题解

样例输出

1189 841

样例输入

A0
#include<stdio.h> int main() { char let; int num; int long_ = 1189,short_ = 841; int newlong = long_,newshort = short_; scanf("%c%d",&let,&num); int type = num; if(type==0){ printf("%d\n",1189); printf("%d",841); }else{ while(type){ // 长边对折 newlong = long_ / 2; if(newlong < short_){ int temp = short_; short_ = newlong; long_ = temp; } type--; } printf("%d\n",long_); printf("%d",short_); } return 0; }

题目 2664:求和

  • 题目描述        给定 n 个整数 a1, a2, · · · , an ,求它们两两相乘再相加的和,即 S = a1 · a2 + a1 · a3 + · · · + a1 · an + a2 · a3 + · · · + an-2 · an-1 + an-2 · an + an-1 · an.
  • 输入格式输入的第一行包含一个整数 n 。 第二行包含 n 个整数 a1, a2, · · · an。
  • 输出格式输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。
  • 提示对于 30% 的数据,1 ≤ n ≤ 1000,1 ≤ ai ≤ 100。对于所有评测用例,1 ≤ n ≤ 200000,1 ≤ ai ≤ 1000。
  • 题解

样例输出

117

样例输入

4 1 3 6 9
#include<bits/stdc++.h> using namespace std; int main(void){ ios_base::sync_with_stdio(0);cin.tie(0); int n; cin>>n; long long sum[200001]; long long ans=0; int a; cin>>a; sum[1]=a; for(int i=2;i<=n;++i){ cin>>a; sum[i]=sum[i-1]+a; ans+=a*sum[i-1]; } cout<<ans; return 0; }

题目 2681: 矩形拼接

  • 输入格式输入包含多组数据。第一行包含一个整数 T,代表数据组数。以下 T 行,每行包含 6 个整数 a1, b1, a2, b2, a3, b3,其中 a1, b1 是第一个矩形的边长,a2, b2 是第二个矩形的边长,a3, b3 是第三个矩形的边长。
  • 输出格式对于每组数据,输出一个整数代表答案。
  • 提示对于 10% 的评测用例,1 ≤ T ≤ 5,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 10,a1 = a2 = a3。对于 30% 的评测用例,1 ≤ T ≤ 5,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 10。对于 60% 的评测用例,1 ≤ T ≤ 10,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 20。对于所有评测用例,1 ≤ T ≤ 1000,1 ≤ a1, b1, a2, b2, a3, b3 ≤ 100。
  • 题解

样例输出

4 6

样例输入

2 2 3 4 1 2 4 1 2 3 4 5 6

题目描述已知 3 个矩形的大小依次是 a1 × b1, a2 × b2 和 a3 × b3。用这 3 个矩形能拼出的所有多边形中,边数最少可以是多少?例如用 3 × 2 的矩形(用 A 表示)、4 × 1 的矩形(用 B 表示)和 2 × 4 的矩形(用 C 表示)可以拼出如下 4 边形。

蓝桥杯2022年第十三届省赛真题矩形拼接1

例如用 3 × 2 的矩形(用 A 表示)、3 × 1 的矩形(用 B 表示)和 1 × 1 的矩形(用 C 表示)可以拼出如下 6 边形。

蓝桥杯2022年第十三届省赛真题矩形拼接2
#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; //完全不匹配时的答案为8 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] + 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[i][ii] == a[k][kk]) ans = min(ans, 6); //三个矩形的长全部相等 if (a[i][ii] == a[j][jj] && a[i][ii] == a[k][kk]) ans = min(ans, 4); } cout << ans << endl; } return 0; } 

题目 2665: 选数异或

  • 题目描述给定一个长度为 n 的数列 A1, A2, · · · , An 和一个非负整数 x,给定 m 次查询, 每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x 。
  • 输入格式输入的第一行包含三个整数 n, m, x 。第二行包含 n 个整数 A1, A2, · · · , An 。接下来 m 行,每行包含两个整数 li ,ri 表示询问区间 [li ,ri ] 。
  • 输出格式对于每个询问, 如果该区间内存在两个数的异或为 x 则输出 yes, 否则输出 no。
  • 提示显然整个数列中只有 2, 3 的异或为 1。对于 20% 的评测用例,1 ≤ n, m ≤ 100;对于 40% 的评测用例,1 ≤ n, m ≤ 1000;对于所有评测用例,1 ≤ n, m ≤ 100000 ,0 ≤ x < 2的20次方 ,1 ≤ li ≤ ri ≤ n , 0 ≤ Ai < 2的20次方。 
  • 题解

样例输出

yes no yes no

样例输入

4 4 1 1 2 3 4 1 4 1 2 2 3 3 3
#include<bits/stdc++.h> using namespace std; int main(void){ ios_base::sync_with_stdio(0);cin.tie(0); int n,m,x; cin>>n>>m>>x; int arry[100002]; unordered_map<int,vector<int>> Map; //记录值和所有下标 vector<vector<int>> ans; for(int i=1;i<=n;++i){//O(n) cin>>arry[i]; if(Map.find(arry[i])==Map.end()) Map[arry[i]]={i}; else Map[arry[i]].emplace_back(i); } for(int i=1;i<=n;++i){//O(n*pair) if(Map.find(arry[i]^x)!=Map.end()){ //i 与 Map[arry[i]^x] 这俩位置可以异或为x int temp=arry[i]^x; for(int j=0;j<Map[temp].size();++j){ //由于答案是成对出现的,这里肯定会出现重复,但是不一定对称 ans.push_back({min(i,Map[temp][j]),max(i,Map[temp][j])}); } } } while(m--){ int left,right; cin>>left>>right; bool flag=true; for(int j=0;j<ans.size();++j){//O(m*pair) if(left<=ans[j][0]&&right>=ans[j][1]){ cout<<"yes"<<'\n'; flag=false; break; } } if(flag) cout<<"no"<<'\n'; } return 0; }

题目 2682: GCD

  • 题目描述给定两个不同的正整数 a, b,求一个正整数 k 使得 gcd(a + k, b + k) 尽可能大,其中 gcd(a, b) 表示 a 和 b 的最大公约数,如果存在多个 k,请输出所有满足条件的 k 中最小的那个。 
  • 输入格式输入一行包含两个正整数 a, b,用一个空格分隔。 
  • 输出格式输出一行包含一个正整数 k。
  • 提示对于 20% 的评测用例,a < b ≤ 10的5次方 ;
    对于 40% 的评测用例,a < b ≤ 10的9次方 ;
    对于所有评测用例,1 ≤ a < b ≤ 10的18次方 。
  • 题解

样例输出

1

样例输入

5 7
#include<iostream> using namespace std; int main() { long long a,b,c,d; cin>>a>>b; if(a>b){ long long t=a; a=b; b=t; } c=b-a; d=a/c; if(a%c) d++; cout<<d*c-a<<endl; return 0; } 

题目 2667: 青蛙过河

  • 题目描述小青蛙住在一条河边,它想到河对岸的学校去学习。小青蛙打算经过河里的石头跳到对岸。河里的石头排成了一条直线,小青蛙每次跳跃必须落在一块石头或者岸上。不过,每块石头有一个高度,每次小青蛙从一块石头起跳,这块石头的高度就会下降 1,当石头的高度下降到 0 时小青蛙不能再跳到这块石头上(某次跳跃后使石头高度下降到 0 是允许的)。小青蛙一共需要去学校上 x 天课,所以它需要往返 2x 次。当小青蛙具有一个跳跃能力 y 时,它能跳不超过 y 的距离。请问小青蛙的跳跃能力至少是多少才能用这些石头上完 x 次课。
  • 输入格式输入的第一行包含两个整数 n, x,分别表示河的宽度和小青蛙需要去学校的天数。请注意 2x 才是实际过河的次数。第二行包含 n − 1 个非负整数 H1, H2, · · · , Hn-1,其中 Hi > 0 表示在河中与小青蛙的家相距 i 的地方有一块高度为 Hi 的石头,Hi = 0 表示这个位置没有石头。
  • 输出格式输出一行,包含一个整数,表示小青蛙需要的最低跳跃能力。
  • 提示由于只有两块高度为 1 的石头,所以往返只能各用一块。第 1 块石头和对岸的距离为 4,如果小青蛙的跳跃能力为 3 则无法满足要求。所以小青蛙最少需要 4 的跳跃能力。 对于 30% 的评测用例,n ≤ 100;对于 60% 的评测用例,n ≤ 1000;对于所有评测用例,1 ≤ n ≤ 10的5次方 , 1 ≤ x ≤ 10的9次方 , 1 ≤ Hi ≤ 10的4次方。
  • 题解

样例输出

4

样例输入

5 1 1 0 1 0
#include <iostream> #include <cstring> #include <algorithm> #include <stack> using namespace std; typedef long long LL; typedef pair<int,int>pii; const int mod = 1e9 + 7 , INF = 0x3f3f3f3f , N = 1e5 + 10; int n,m; int a[N]; bool check(int x) { // 如果所有长度为x的区间都大于等于m ,则true int s = 0; for (int i = 1 ; i <= min(n - 1,x) ; i ++) s += a[i]; if (s < m) return false; for (int i = x + 1; i <= n - 1; i ++) { s -= a[i - x]; s += a[i]; if (s < m) return false; } return s >= m; } int main() { cin >> n >> m; m *= 2; for (int i = 1 ; i <= n - 1 ; i ++) cin >> a[i]; int l = 0,r = n; while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; else l = mid + 1; } cout << r << endl; }

题目 2683: 因数平方和

  • 题目
  •  题解
import java.time.format.DateTimeFormatter; import java.time.LocalDateTime; public class Test { public static void main(String[] args) { new Test().run(); } void run() { DateTimeFormatter date = DateTimeFormatter.ofPattern("MMdd"); DateTimeFormatter time = DateTimeFormatter.ofPattern("HHmm"); LocalDateTime start = LocalDateTime.of(0000, 01, 01, 00, 00); LocalDateTime end = LocalDateTime.of(0000, 12, 31, 23, 59); int[] buff = new int[128]; int ans = 0; for (; start.compareTo(end) <= 0; start = start.plusMinutes(1)) { for (char i = '0'; i <= '9'; ++i) buff[i] = 0; for (byte b : start.format(date).getBytes()) ++buff[b]; boolean flag1 = true, flag3 = true; for (char i = '0'; i <= '9'; ++i) if (buff[i] == 1) flag1 = false; else if (buff[i] == 3) flag3 = false; if (flag1 || flag3) continue; for (byte b : start.format(time).getBytes()) --buff[b]; for (char i = '0'; i <= '9'; ++i) if (buff[i] != 0) flag1 = true; if (!flag1) ++ans; } System.out.println(4 * ans); } }

题目 2668: 最长不下降子序列

  • 题目
  •  题解
package leetcode板块; import java.util.Arrays; import java.util.Scanner; public class _题目2668蓝桥杯2022年第十三届省赛真题_最长不下降子序列 { /** * * @param args */ public static void main(String[] args) { // 现在你有一次机会,将其中【连续的 K 个数】 修改成 【任意一个相同值】。 // 请你计算如何修改可以使修改后的数列的最长不下降子序列最长,请输出这个最长的长度。 // TODO 最长不下降子序列是指序列中的一个子序列,子序列中的每个数不小于在它之前的数。 /* 对于所有评测用例,1 ≤ K ≤ N ≤ 10^5,1 ≤ Ai ≤ 10^6。 */ Scanner scanner = new Scanner(System.in); // 长度为 N , 将其中连续的 K 个数修改成任意一个相同值 int N = scanner.nextInt(); int K = scanner.nextInt(); int arrA [] = new int[N]; for (int i = 0; i<N;i++){ arrA[i] = scanner.nextInt(); } scanner.close(); // 重点 : LNDS:longest non-decreasing subsequence int initLNDS = computeLNDS(arrA); int maxLNDS = initLNDS; // ---------------------------------------------- for (int i = 0; i <= N-K;i++){ int [] original = Arrays.copyOfRange(arrA,i,i+K); int uniqueVals [] = Arrays.stream(arrA).distinct().toArray(); for (int value : uniqueVals){ for (int j = i;j<i+K;j++){ arrA[j] = value; } int modifiedLNDS = computeLNDS(arrA); maxLNDS = Math.max(maxLNDS,modifiedLNDS); } System.arraycopy(original,0,arrA,i,K); } System.out.println(maxLNDS); } /** * * @param array * @return */ private static int computeLNDS(int[] array) { int [] dp_computeLNDS = new int[array.length]; int length = 0; for (int num : array){ int pos = Arrays.binarySearch(dp_computeLNDS,0,length,num); if (pos < 0){ pos = -(pos + 1); } dp_computeLNDS[pos] = num; if (pos == length){ length++; } } return length; } } 

Read more

Elasticsearch + Kibana 实战指南:从安装部署到 C++ 客户端封装,解锁搜索引擎开发核心技能

Elasticsearch + Kibana 实战指南:从安装部署到 C++ 客户端封装,解锁搜索引擎开发核心技能

文章目录 * 本篇摘要 * 一.ES 介绍及简单使用 * 1·介绍 * 2.安装过程 * 检测是否安转成功 * 对应配置文件修改 * 3.ES核心知识概念 * **1. 索引(Index-->库)** * **2. 文档(Document)** * **3. 字段(Field)** * **4. 类型(Type-->类似表)**(7.x后已废弃) * **5. 映射(Mapping)** * 4.kibana介绍 * **Kibana 是什么?** * **Kibana 和 Elasticsearch 的关系** * 5.安装Kibana过程 * 6.kibana-es使用 * 7.es-client使用及封装使用接口 * es接口 * 1.

By Ne0inhk
【C++】哈希扩展——位图和布隆过滤器的介绍与实现

【C++】哈希扩展——位图和布隆过滤器的介绍与实现

各位读者大佬好,我是落羽!一个坚持不断学习进步的学生。 如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步! 也欢迎关注我的blog主页:落羽的落羽 文章目录 * 一、位图 * 1. 概念与实现 * 2. std::bitset * 二、布隆过滤器 * 1. 概念 * 2. 布隆过滤器误判率数学推导 * 3. 实现 一、位图 1. 概念与实现 在许多公司的面试题中会考到这样的场景:给40亿个不重复无符号整数,如何快速判断一个数是否在这40亿数中。 如果使用常规思路,每次查询暴力遍历O(N)太慢,排序+二分查找O(NlogN)+O(logN),内存不足以放下这些数据。 数据是否在给定的整型数据中,结果是在或不在,正好是两种状态,那么可以用一个二进制比特位来代表数据是否存在的信息,比特位为1代表存在,比特位为0代表不在。那么,我们可以设计一个用比特位表示数据是否存在的数据结构——位图!

By Ne0inhk
Java外功实战(4)——SpringBoot登录认证全栈实现:Session、统一结果封装、MD5加密与拦截器

Java外功实战(4)——SpringBoot登录认证全栈实现:Session、统一结果封装、MD5加密与拦截器

本文简介 目的:Spring生态为Java后端开发提供了强大支持,但将分散的技术点整合成完整解决方案往往令人困惑。本文将以登录接口为切入点,系统演示如何将IOC/DI、MyBatis数据持久化、MD5加密、Session/Cookie管理、JWT令牌和拦截器机制融合运用,打造企业级认证方案 技术栈:前端:HTML + CSS + JavaScript + Jquery后端:SpringBoot + Mybatis + JWT 搭建环境:数据库:MySQL8.4.0项目结构:maven前端框架:Jquery后端框架:SpringBootJDK:17编译器:IDEA 目录结构: 项目搭建及配置 1.创建SpringBoot3.0.0+项目并添加依赖:Spring Web、MyBatis Framework、MySQL Driver、Lombok 2.初始化数据库: createdatabase spring_

By Ne0inhk