202112 CSP认证 | 登机牌条码

2024-03-15 19:12

本文主要是介绍202112 CSP认证 | 登机牌条码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

登机牌条码
在这里插入图片描述

这个题的难度相比于神经脉冲网络感觉是往两个方向,该题没有太多的注重时间和空间的优化,重难点在于实现矩阵除法,也就是算法逻辑。

借鉴了这个链接实现:登机牌条码 详细图解

链接详细讲述了如何实现矩阵除法以及矩阵乘法,感觉在今后的算法题中都是很好的借鉴!!
本题代码中为了方便我用了deque双端队列,实现在两端的存储和删除操作(主要针对于乘法操作的地位补0更加方便);感觉在理解了矩阵除法的计算机思维后要如何实现以后代码就变得很容易了

这里补充一个点,在算padding填充的时候我的代码本来是:padding = w - (1 + 有效数据长度 + 填充数据长度) % w,导致只有90分,这里没有考虑一个情况,也就是刚好数据长度 + 填充码字长度刚好可以被整除的时候,此时无需填充,因此修改代码为:
padding = (1 + sz + k ) % w == 0 ? 0 : w - (1 + sz + k) % w,此时满分。
满分代码如下:

#include<bits/stdc++.h>
using namespace std;
int w, s, k;
vector<int> res;
void dataCoding(string line)
{int mode = 1;  //编码模式初始为大写vector<int> temp;for(int i = 0;i < line.size();i ++){if(line[i] >= 'A' && line[i] <= 'Z'){  //'A'-0 = 65if(mode == 2){temp.push_back(28); temp.push_back(28);}else if(mode == 3){temp.push_back(28);}mode = 1;temp.push_back(line[i] - 65);}else if(line[i] >= 'a' && line[i] <= 'z'){ //'a'- 0=97if(mode != 2){temp.push_back(27);mode = 2;}temp.push_back(line[i] - 97);}else {  //'0'- 0 = 48if(mode != 3) temp.push_back(28);mode = 3;temp.push_back(line[i] - 48);}}if(temp.size() % 2) temp.push_back(29);int sz = temp.size(); sz /= 2; //sz为有效数据码字个数//先计算长度码字int padding = (k + sz + 1) % w == 0 ? 0 : w - (k + sz + 1) % w;int len = 1 + sz + padding;res.push_back(len);for(int i = 0;i < temp.size(); i += 2){int x = 30 * temp[i] + temp[i + 1];res.push_back(x);}for(int i = 0;i < padding;i ++){res.push_back(900);}
}//计算gx
deque<int> calgx()
{deque<int> gx;int mul = -9;gx.push_back(-3); gx.push_back(1);  //初始时为x-3,向量表示为(-3,1)for(int j = 0;j < k - 1;j ++){//先计算与常数相乘vector<int> temp;for(int i = 0;i < gx.size();i ++){int x = (mul * gx[i]) % 929;temp.push_back(x);}gx.push_front(0);  //乘xfor(int i = 0;i < temp.size();i ++){  //相加操作gx[i] = (gx[i] + temp[i]) % 929;}mul = (mul * 3) % 929;}return gx;/*for(int i = 0;i < gx.size();i ++){cout << gx[i] << " ";}cout << "\n";*/
}
deque<int> calkdx()
{deque<int> dq;for(int i = 0;i < k;i ++){   //直接补零dq.push_back(0);}for(int i = res.size() - 1;i >= 0;i --){dq.push_back(res[i]);}return dq;
}
void checkCoding()
{deque<int> gx = calgx();deque<int> kdx = calkdx();//r(x)为kdx与gx的余数部分int n = res[0];for(int t = 1; t <= n;t ++) {  //kdx > gx , gx 不变被用作除数; 最后rx为余数的位次比除数少一, 也就是k - 1次, 计算可得需要消n次deque<int> mul = gx;int sz = kdx.size();for(int i = 0;i < sz - gx.size();i ++){   //补零到最高位对齐, 从高位向低位消mul.push_front(0);}int delta = kdx[sz - 1] / (mul[sz - 1]);for(int i = 0;i < sz;i ++){mul[i] = (mul[i] * delta) % 929;kdx[i] = (kdx[i] - mul[i]) % 929;}kdx.pop_back();}for(int i = kdx.size() - 1;i >= 0;i --){kdx[i] = -1 * kdx[i];   //-r(x) = 余数if(kdx[i] < 0) kdx[i] += 929;res.push_back(kdx[i]);//cout<<kdx[i] << ' ';}//cout << "\n";
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> w >> s;k = s != -1 ? pow(2, s + 1) : 0;string line; cin >> line;dataCoding(line);if(k){checkCoding();}for(int i = 0;i < res.size();i ++){cout << res[i] << "\n";}return 0;
}

哦对了,最最重要的一点,通常在最后需要取模的情况下,在中间运算结果中就可以开始取模防止溢出了(这个是取模操作的运算律)!!!感觉是后面很多涉及对结果取模操作的常规操作了。

这篇关于202112 CSP认证 | 登机牌条码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/812989

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

【Shiro】Shiro 的学习教程(二)之认证、授权源码分析

目录 1、背景2、相关类图3、解析3.1、加载、解析阶段3.2、认证阶段3.3、授权阶段 1、背景 继上节代码,通过 debug 进行 shiro 源码分析。 2、相关类图 debug 之前,先了解下一些类的结构图: ①:SecurityManager:安全管理器 DefaultSecurityManager: RememberMeManager:实现【记住我】功能

OpenStack离线Train版安装系列—3控制节点-Keystone认证服务组件

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack Victoria版——3.控制节点-Keystone认证服务组件

3.控制节点-Keystone认证服务组件 更多步骤:OpenStack Victoria版安装部署系列教程 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版 离线安装部署系列教程(全) OpenStack Train版 离线安装部署系列教程(全) 欢迎留言沟通,共同进步。 文章目录 创建key

CSP-J基础之数学基础 初等数论 一篇搞懂(二)

文章目录 前言算术基本定理简介什么是质数?举个简单例子:重要的结论:算术基本定理公式解释:举例: 算术基本定理的求法如何找出质因数:举个简单的例子: 重要的步骤:C++实现 同余举个例子:同余的性质简介1. 同余的自反性2. 同余的对称性3. 同余的传递性4. 同余的加法性质5. 同余的乘法性质 推论 总结 前言 在计算机科学和数学中,初等数论是一个重要的基础领域,涉及到整数

CSP-J基础之cmath常见函数

文章目录 前言1. **`sin` 函数**2. **`cos` 函数**3. **`exp` 函数**4. **`log` 函数**5. **`fabs` 函数**6. **`pow` 函数**7. **`sqrt` 函数**8. **`ceil` 函数**9. **`floor` 函数** 总结 前言 在计算机科学与编程中,数学函数是解决各种计算问题的基础工具。C++标准

CSP-J选择题 - 排列组合

排列问题:有5名学生参加比赛,要求排成一排拍照,有多少种不同的排列方式?组合问题:从10本书中选出3本书送给朋友,有多少种不同的选择方式?排列问题:一个教室有7个座位,5个学生需要坐下,有多少种不同的排列方式?组合问题:从12个人中选出4个人组成一个团队,有多少种不同的方式?排列问题:一个密码由4个字母组成,字母可以重复使用,有多少种不同的排列组合?组合问题:从8个不同颜色的球中选出3个,不考虑顺