news 2026/4/22 3:30:04

GESP认证C++编程真题解析 | B3851 [GESP202306 四级] 图像压缩

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GESP认证C++编程真题解析 | B3851 [GESP202306 四级] 图像压缩

​欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总帖:GESP认证C++编程真题解析 | 汇总


【题目来源】

洛谷:[B3851 GESP202306 四级] 图像压缩 - 洛谷

【题目描述】

图像是由很多的像素点组成的。如果用0 00表示黑,255 255255表示白,0 00255 255255之间的值代表不同程度的灰色,则可以用一个字节表达一个像素(取值范围为十进制0-255、十六进制00-FF)。这样的像素组成的图像,称为256 256256级灰阶的灰度图像。

现在希望将256 256256级灰阶的灰度图像压缩为16 1616级灰阶,即每个像素的取值范围为十进制0-15、十六进制0-F。压缩规则为:统计出每种灰阶的数量,取数量最多的前16 1616种灰阶(如某种灰阶的数量与另外一种灰阶的数量相同,则以灰阶值从小到大为序),分别编号0-F(最多的编号为0,以此类推)。其他灰阶转换到最近的16 1616种灰阶之一,将某个点的灰阶值(灰度,而非次数)与16 1616种灰阶中的一种相减,绝对值最小即为最近,如果绝对值相等,则编号较小的灰阶更近。

【输入】

输入第1 11行为一个正整数n ( 10 ≤ n ≤ 20 ) n(10\le n \le 20)n(10n20),表示接下来有n nn行数据组成一副256 256256级灰阶的灰度图像。

2 22行开始的n nn行,每行为长度相等且为偶数的字符串,每两个字符用十六进制表示一个像素。约定输入的灰度图像至少有16 1616种灰阶。约定每行最多20 2020个像素。

【输出】

第一行输出压缩选定的16 1616种灰阶的十六进制编码,共计32 3232个字符。

第二行开始的n nn行,输出压缩后的图像,每个像素一位十六进制数表示压缩后的灰阶值。

【输入样例】

10 00FFCFAB00FFAC09071B5CCFAB76 00AFCBAB11FFAB09981D34CFAF56 01BFCEAB00FFAC0907F25FCFBA65 10FBCBAB11FFAB09981DF4CFCA67 00FFCBFB00FFAC0907A25CCFFC76 00FFCBAB1CFFCB09FC1AC4CFCF67 01FCCBAB00FFAC0F071A54CFBA65 10EFCBAB11FFAB09981B34CFCF67 01FFCBAB00FFAC0F071054CFAC76 1000CBAB11FFAB0A981B84CFCF66

【输出样例】

ABCFFF00CB09AC07101198011B6776FC 321032657CD10E 36409205ACC16D B41032657FD16D 8F409205ACF14D 324F326570D1FE 3240C245FC411D BF4032687CD16D 8F409205ACC11D B240326878D16E 83409205ACE11D

【算法标签】

《洛谷 B3851 图像压缩》 #模拟# #函数与递归# #GESP# #2023#

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;constintN=500;// 最大可能的字节模式数量intn;// 输入的十六进制字符串数量intcur;// 当前不同的字节模式数量string b[25];// 存储输入的十六进制字符串charhe[]={' ','0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};// 16进制字符映射// 存储字节模式的结构体structNode{string t;// 字节模式(2个十六进制字符)intnum;// 该模式出现的次数charid;// 分配给该模式的16进制字符}a[N];// 比较函数:先按出现次数降序,次数相同按字节模式升序boolcmp(Node x,Node y){if(x.num!=y.num)returnx.num>y.num;// 次数多的排前面returnx.t<y.t;// 字典序小的排前面}/** * 将十六进制字符串转换为十进制数 * @param s 2个字符的十六进制字符串 * @return 对应的十进制数值 */intcalc(string s){intres=0;for(inti=0;i<s.size();i++){if(s[i]<='9'){res=res*16+s[i]-'0';// 数字字符}else{res=res*16+s[i]-'A'+10;// 字母字符A-F}}returnres;}intmain(){// 输入十六进制字符串数量cin>>n;// 处理每个输入的十六进制字符串for(inti=1;i<=n;i++){cin>>b[i];// 每2个字符作为一个字节模式进行处理for(intj=0;j<b[i].size()-1;j+=2){// 提取字节模式(2个字符)string t="";t+=b[i][j];t+=b[i][j+1];// 检查该模式是否已存在boolflag=false;for(intk=1;k<=cur;k++){if(a[k].t==t){flag=true;a[k].num++;// 增加出现次数break;}}// 如果不存在,添加到数组中if(!flag){cur++;a[cur].t=t;a[cur].num=1;}}}// 按出现次数降序排序,次数相同按字典序升序sort(a+1,a+cur+1,cmp);// 为前16个最频繁的字节模式分配16进制字符标识for(inti=1;i<=16;i++){a[i].id=he[i];// 使用'0'-'9','A'-'F'}// 为剩余的模式分配标识for(inti=17;i<=cur;i++){intminj=1;// 最相似的模式索引intminn=1e9;// 最小差值// 在16个标识模式中寻找最相似的模式for(intj=1;j<=16;j++){intt1=calc(a[j].t);// 标识模式的数值intt2=calc(a[i].t);// 当前模式的数值// 计算数值差值的绝对值if(abs(t1-t2)<minn){minn=abs(t1-t2);minj=j;// 更新最相似模式的索引}}// 分配与最相似模式相同的标识a[i].id=a[minj].id;}// 输出16个标识模式for(inti=1;i<=16;i++){cout<<a[i].t;}cout<<endl;// 输出压缩后的字符串for(inti=1;i<=n;i++){for(intj=0;j<b[i].size()-1;j+=2){// 提取字节模式string t="";t+=b[i][j];t+=b[i][j+1];// 查找对应的标识字符for(intk=1;k<=cur;k++){if(t==a[k].t){cout<<a[k].id;// 输出标识break;}}}cout<<endl;// 每个原始字符串输出一行}return0;}

【运行结果】

10 00FFCFAB00FFAC09071B5CCFAB76 00AFCBAB11FFAB09981D34CFAF56 01BFCEAB00FFAC0907F25FCFBA65 10FBCBAB11FFAB09981DF4CFCA67 00FFCBFB00FFAC0907A25CCFFC76 00FFCBAB1CFFCB09FC1AC4CFCF67 01FCCBAB00FFAC0F071A54CFBA65 10EFCBAB11FFAB09981B34CFCF67 01FFCBAB00FFAC0F071054CFAC76 1000CBAB11FFAB0A981B84CFCF66 ABCFFF00CB09AC07101198011B6776FC 321032657CD10E 36409205ACC16D B41032657FD16D 8F409205ACF14D 324F326570D1FE 3240C245FC411D BF4032687CD16D 8F409205ACC11D B240326878D16E 83409205ACE11D
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 17:12:03

面向生产环境的LLM Prompt 优化:从零基础入门到精通,一篇全搞定!

文章介绍了四种提升LLM应用性能的技术&#xff1a;利用缓存token降低成本和延迟&#xff0c;将用户问题置于提示末尾提升回答质量&#xff0c;使用提示优化器改进提示结构&#xff0c;以及建立定制化基准测试选择最适合的模型。这些方法简单易行&#xff0c;能显著提高LLM应用的…

作者头像 李华
网站建设 2026/4/16 15:34:10

网站攻击技术,一篇打包带走!

网站攻击技术&#xff0c;一篇打包带走&#xff01; 大家好&#xff0c;今天给大家介绍一下&#xff0c;Web安全领域常见的一些安全问题。 1. SQL 注入 SQL注入攻击的核心在于让Web服务器执行攻击者期望的SQL语句&#xff0c;以便得到数据库中的感兴趣的数据或对数据库进行读…

作者头像 李华
网站建设 2026/4/16 11:11:40

【量子开发效率翻倍秘诀】:深度集成VS Code实现Q#与Python双向代码导航

第一章&#xff1a;量子开发效率翻倍的核心挑战在当前量子计算快速发展的背景下&#xff0c;提升开发效率成为推动技术落地的关键。然而&#xff0c;受限于硬件稳定性、算法抽象层级低以及工具链不成熟等因素&#xff0c;开发者面临诸多障碍。要实现量子开发效率的翻倍增长&…

作者头像 李华
网站建设 2026/4/16 11:04:33

面向数字孪生系统的全方位测试解决方案

1 测试背景与目标 1.1 背景分析 数字孪生作为物理实体在虚拟空间的动态映射体&#xff0c;其测试复杂度远超传统软件系统。根据Gartner最新研究报告&#xff0c;到2027年超过70%的制造业企业将使用数字孪生技术进行流程优化&#xff0c;这对测试从业者提出了三大核心挑战&…

作者头像 李华
网站建设 2026/4/21 20:17:23

【044】Executors 是陷阱!Executor 实战优化,生产环境不翻车的秘诀

文章目录零、引入一、王二的致命坑&#xff1a;Executors 的 “甜蜜陷阱”二、用 “医院挂号” 讲透 Executor 实战优化&#xff1a;可控才是王道&#x1f4af; Executor 实战优化 4 大核心&#xff08;王二记在病历本上&#xff09;三、实战 1&#xff1a;线程池隔离 批量任务…

作者头像 李华
网站建设 2026/4/16 14:29:00

llama.cpp Server 引入路由模式:多模型热切换与进程隔离机制详解

llama.cpp server在 2025年12月11日发布的版本中正式引入了 router mode&#xff08;路由模式&#xff09;&#xff0c;如果你习惯了 Ollama 那种处理多模型的方式&#xff0c;那这次 llama.cpp 的更新基本就是对标这个功能去的&#xff0c;而且它在架构上更进了一步。 路由模式…

作者头像 李华