news 2026/3/21 20:18:07

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/3/17 21:51:17

为什么90%的团队搞不定云原生Agent部署?Docker批量方案深度拆解

第一章&#xff1a;云原生Agent部署的现状与挑战随着云原生技术的快速发展&#xff0c;Agent作为实现可观测性、自动化运维和安全监控的核心组件&#xff0c;被广泛部署于Kubernetes集群、边缘节点及混合云环境中。这些轻量级代理程序负责采集指标、日志和追踪数据&#xff0c;…

作者头像 李华
网站建设 2026/3/15 8:00:33

2025年为何越来越多的程序员都转行网络安全?难道发展前景更好?

2025年为何越来越多的程序员都转行网络安全&#xff1f;难道发展前景更好&#xff1f; 为何越来越多的程序员纷纷转行网络安全&#xff1f; 其实黑客都是程序员&#xff0c;但是并不是所有的程序员都是黑客. 从企业和社会需求来看&#xff0c;现在真不缺程序猿 &#xff0c;反…

作者头像 李华
网站建设 2026/3/18 5:50:32

统信域管域用户在加域计算机中的组

统信域管域用户在加域计算机中会自动创建与用户名相同的组&#xff0c;并且域用户会同时在dialout、disk、sambashare、vboxusers、netdev、scanner、lpadmin、users、sudo、udcp、lp组中test2:x:10093:test2 dialout:x:20:test,test2 disk:x:6:test,test2 sambashare:x:998:te…

作者头像 李华
网站建设 2026/3/20 10:58:01

研究锂离子电池模型中的最佳性能和效率:对电池组配置、负载选择、放电倍率(C-rate)、容量和电量状态(SOC)的全面研究附Simulink仿真

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

作者头像 李华
网站建设 2026/3/15 14:29:14

测试数据生成技术:策略、挑战与最佳实践

在当今敏捷开发与持续集成的主流环境下&#xff0c;高质量的测试数据已成为保障软件可靠性的关键要素。有效的测试数据不仅能够模拟真实业务场景&#xff0c;更能暴露潜在安全漏洞与性能瓶颈。本文系统梳理测试数据生成的技术体系&#xff0c;结合行业实践&#xff0c;为测试工…

作者头像 李华