2026/4/18 12:08:19
网站建设
项目流程
无锡企业网站制作哪家好,百度站长怎样添加网站,黑龙江省住房和城乡建设厅,官方网站建设投标书欢迎大家订阅我的专栏#xff1a;算法题解#xff1a;C与Python实现#xff01; 本专栏旨在帮助大家从基础到进阶 #xff0c;逐步提升编程能力#xff0c;助力信息学竞赛备战#xff01;
专栏特色 1.经典算法练习#xff1a;根据信息学竞赛大纲#xff0c;精心挑选…欢迎大家订阅我的专栏算法题解C与Python实现本专栏旨在帮助大家从基础到进阶 逐步提升编程能力助力信息学竞赛备战专栏特色1.经典算法练习根据信息学竞赛大纲精心挑选经典算法题目提供清晰的代码实现与详细指导帮助您夯实算法基础。2.系统化学习路径按照算法类别和难度分级从基础到进阶循序渐进帮助您全面提升编程能力与算法思维。适合人群准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生希望系统学习C/Python编程的初学者想要提升算法与编程能力的编程爱好者附上汇总帖GESP认证C编程真题解析 | 汇总【题目来源】洛谷[B3851 GESP202306 四级] 图像压缩 - 洛谷【题目描述】图像是由很多的像素点组成的。如果用0 00表示黑255 255255表示白0 00和255 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(10≤n≤20)表示接下来有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#【代码详解】#includebits/stdc.husingnamespacestd;constintN500;// 最大可能的字节模式数量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.numy.num;// 次数多的排前面returnx.ty.t;// 字典序小的排前面}/** * 将十六进制字符串转换为十进制数 * param s 2个字符的十六进制字符串 * return 对应的十进制数值 */intcalc(string s){intres0;for(inti0;is.size();i){if(s[i]9){resres*16s[i]-0;// 数字字符}else{resres*16s[i]-A10;// 字母字符A-F}}returnres;}intmain(){// 输入十六进制字符串数量cinn;// 处理每个输入的十六进制字符串for(inti1;in;i){cinb[i];// 每2个字符作为一个字节模式进行处理for(intj0;jb[i].size()-1;j2){// 提取字节模式2个字符string t;tb[i][j];tb[i][j1];// 检查该模式是否已存在boolflagfalse;for(intk1;kcur;k){if(a[k].tt){flagtrue;a[k].num;// 增加出现次数break;}}// 如果不存在添加到数组中if(!flag){cur;a[cur].tt;a[cur].num1;}}}// 按出现次数降序排序次数相同按字典序升序sort(a1,acur1,cmp);// 为前16个最频繁的字节模式分配16进制字符标识for(inti1;i16;i){a[i].idhe[i];// 使用0-9,A-F}// 为剩余的模式分配标识for(inti17;icur;i){intminj1;// 最相似的模式索引intminn1e9;// 最小差值// 在16个标识模式中寻找最相似的模式for(intj1;j16;j){intt1calc(a[j].t);// 标识模式的数值intt2calc(a[i].t);// 当前模式的数值// 计算数值差值的绝对值if(abs(t1-t2)minn){minnabs(t1-t2);minjj;// 更新最相似模式的索引}}// 分配与最相似模式相同的标识a[i].ida[minj].id;}// 输出16个标识模式for(inti1;i16;i){couta[i].t;}coutendl;// 输出压缩后的字符串for(inti1;in;i){for(intj0;jb[i].size()-1;j2){// 提取字节模式string t;tb[i][j];tb[i][j1];// 查找对应的标识字符for(intk1;kcur;k){if(ta[k].t){couta[k].id;// 输出标识break;}}}coutendl;// 每个原始字符串输出一行}return0;}【运行结果】10 00FFCFAB00FFAC09071B5CCFAB76 00AFCBAB11FFAB09981D34CFAF56 01BFCEAB00FFAC0907F25FCFBA65 10FBCBAB11FFAB09981DF4CFCA67 00FFCBFB00FFAC0907A25CCFFC76 00FFCBAB1CFFCB09FC1AC4CFCF67 01FCCBAB00FFAC0F071A54CFBA65 10EFCBAB11FFAB09981B34CFCF67 01FFCBAB00FFAC0F071054CFAC76 1000CBAB11FFAB0A981B84CFCF66 ABCFFF00CB09AC07101198011B6776FC 321032657CD10E 36409205ACC16D B41032657FD16D 8F409205ACF14D 324F326570D1FE 3240C245FC411D BF4032687CD16D 8F409205ACC11D B240326878D16E 83409205ACE11D