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;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3分钟阿里云数据库购买、数据库创建和连接教程

阿里云数据库怎么使用&#xff1f;阿里云服务器网aliyunfuwuqi.com整理阿里云数据库从购买到使用全流程&#xff0c;阿里云支持MySQL、SQL Server、PostgreSQL和MariaDB等数据库引擎&#xff0c;阿里云数据库具有高可用、高容灾特性&#xff0c;阿里云提供数据库备份、恢复、迁…

快递查询轻松搞定:一键查询,物流信息尽在掌握

在快节奏的现代生活中&#xff0c;快递已成为我们日常不可或缺的一部分。但你是否曾因为繁多的快递单号而烦恼&#xff0c;想要轻松掌握每一个包裹的物流信息&#xff1f;现在&#xff0c;一款名为“快递批量查询高手”的神器应运而生&#xff0c;它将帮助你轻松搞定快递查询&a…

语义分割前言

1.常见数据集 1.1PASCAL VOC 其标注图片为单通道图像&#xff0c;其0~255像素值为其取值范围&#xff0c;背景为0&#xff0c;目标区域内根据目标的类别索引信息进行填充。 1.2MS COCO 其标注图像的标注文件为坐标信息。 官网有给出一个关于标注文件的格式说明&#xff0…

计算机毕业设计-springboot+vue前后端分离电竞社交平台管理系统部分成果分享

4.5系统结构设计 本系统使用的角色主要有系统管理员、顾客、接单员&#xff0c;本系统为后台管理系统&#xff0c;游客用户可以经过账号注册&#xff0c;管理员审核通过后&#xff0c;用账号密码登录系统&#xff0c;查看后台首页&#xff0c;模块管理&#xff08;顾客信息&am…

SpringBoot3整合Mybatis-Plus与PageHelper包冲突解决

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SpringBoot3整合Mybatis-Plus与PageHelper包冲突解决 ⏱️ 创作时间&a…

位运算#蓝桥杯

位运算#蓝桥杯 文章目录 位运算#蓝桥杯1、小蓝学位运算2、异或森林3、位移4、笨笨的机器人5、博弈论 1、小蓝学位运算 #include<bits/stdc.h> using namespace std; using LL long long; const LL N 1e97; template<int kcz> struct ModInt { #define T (*this)…

小程序(H5)连接微信公众号

报错信息 配自定义菜单 微信公众号没有配“白名单” 配业务域名

echats柱状图\折线图:数量级自动调整;动态设置多维度

通过构造echarts返回体EchartsData.class&#xff0c;在返回体内开发功能代码&#xff0c;实现echarts数据的改动。 特点&#xff1a; 1、y轴数据的数量级自动调整&#xff0c;使图表变化趋势更明显&#xff1b; 2、支持多维度数据【可以有1-N多个维度】 // EchartsData对象构…

Yolo系列算法-理论部分-YOLOv5

0. 写在前面 YOLO系列博客&#xff0c;紧接上一篇Yolo系列算法-理论部分-YOLOv4-CSDN博客 1. YOLOv5-美而全的产品 YOLOv5的诞生&#xff0c;直接将目标检测算法向终局推进&#xff0c;Ultralytics团队在COCO数据集上预训练的目标检测架构和模型直接开源&#xff0c;其中包含了…

世纪互联版Microsoft 365应用无法跳转正确登录门户

很多购买世纪互联&#xff08;国内版&#xff09;Microsoft 365&#xff08;Office 365&#xff09;的用户有时候会遇到在Office应用登录账号时&#xff0c;登陆页面跳转到国际版Microsoft Entra ID&#xff08;Azure AD&#xff09;页面&#xff08;没有备案号&#xff09;&am…

Supervisor,一个超酷的 Python 库!

大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - supervisor。 Github地址&#xff1a;https://github.com/Supervisor/supervisor 在大型项目中&#xff0c;经常需要管理多个进程&#xff0c;确保它们能够稳定运行并协同工作。Python提供了许多工具和库来帮助实现进…

LeetCode438题(无敌双指针——滑动窗口)

找到字符串中所有字母异位词 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1: 输入: s "…