gesp(C++四级)(4)洛谷:B3851:[GESP202306 四级] 图像压缩

news2025/1/8 7:11:18

gesp(C++四级)(4)洛谷:B3851:[GESP202306 四级] 图像压缩

在这里插入图片描述

题目描述

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

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

输入格式

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

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

输出格式

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

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

样例 #1

样例输入 #1

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

样例输出 #1

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

提示

【样例 1 1 1 解释】

灰阶 ABCFFF 出现 14 14 14 次,00 出现 10 10 10 次,CB 出现
9 9 9 次,09 出现 7 7 7 次,AC 出现 6 6 6 次,07 出现 5 5 5 次,1011
98 出现 4 4 4 次,011B6776FC 出现 3 3 3 次。

AC代码(100分)

#include<bits/stdc++.h>
using namespace std;
int n,a[30][30];//a数组用于保存转换后的输入数据 
string s;
//创建结构体:10进制的灰度及其出现次数 
struct node{
	int grey;//灰度 
	int cnt;//出现次数 
}p[260]; 
//十六进制字符转10进制整数
int to10(char c){
	int ans;
	if(c>='0' && c<='9') ans=c-'0';
	else ans=c-'A'+10;
	return ans;
} 
//排序规则函数
bool cmp(node x,node y){
	if(x.cnt!=y.cnt) return x.cnt>y.cnt;//优先按灰度出现的次数降序 
	else return x.grey<y.grey;//其次按灰度编号升序 
} 
//10进制整数打印为16进制 
void print16(int x){
	char c;
	if(x>9) c='A'+x-10;
	else c='0'+x;
	cout<<c; 
} 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){//n行 
		cin>>s;//输入每行的字符串
		//两个字符一组,将16进制转换位10进制保存到数组中
		int x;
		for(int j=0;j<s.size();j+=2){
			x=to10(s[j])*16+to10(s[j+1]);//调用字符转十进制函数 
			a[i][j/2+1]=x;//存到a数组中
			p[x].cnt++; //统计灰度出现的次数 
		} 
	}
	//初始化灰度
	for(int i=0;i<256;i++){
		p[i].grey=i;
	} 
	//p数组排序
	sort(p,p+256,cmp); 
	//输出灰度排名前16:需将10进制数字转换回16进制字符 
	for(int i=0;i<16;i++){
		print16(p[i].grey/16);//打印两位十六进制中的第1位 
		print16(p[i].grey%16);//打印两位十六进制中的第2位
	} 
	cout<<endl;
	//输出压缩后的图像
	int len=s.size()/2;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=len;j++){
			int minc=256;//存:最小差绝对值
			int b=0;//存:最接近的灰度编号 
			for(int k=0;k<=15;k++){
				if(abs(p[k].grey-a[i][j])<minc){
					minc=abs(p[k].grey-a[i][j]);
					b=k;//更新编号 
				}
			}
			//打印找到的与其最近的灰度编号的16进制
			print16(b); 
		}
		cout<<endl;
	} 
	return 0;
}

文末彩蛋:

点击王老师青少年编程主页有更多精彩内容

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

链地址法(哈希桶)

链地址法&#xff08;哈希桶&#xff09; 解决冲突的思路 开放定址法中所有的元素都放到哈希表⾥&#xff0c;链地址法中所有的数据不再直接存储在哈希表中&#xff0c;哈希表 中存储⼀个指针&#xff0c;没有数据映射这个位置时&#xff0c;这个指针为空&#xff0c;有多个数…

【通识安全】煤气中毒急救的处置

1.煤气中毒的主要症状与体征一氧化碳中毒&#xff0c;其中毒症状一般分为轻、中、重三种。 (1)轻度&#xff1a;仅有头晕、头痛、眼花、心慌、胸闷、恶心等症状。如迅速打开门窗&#xff0c;或将病人移出中毒环境&#xff0c;使之吸入新鲜空气和休息&#xff0c;给些热饮料&am…

Synthesia技术浅析(二):虚拟人物视频生成

Synthesia 的虚拟人物视频生成模块是其核心技术之一&#xff0c;能够将文本输入转换为带有同步语音和口型的虚拟人物视频。该模块如下所示&#xff1a; 1.文本输入处理 2.语音生成&#xff08;TTS, Text-to-Speech&#xff09; 3.口型同步&#xff08;Lip Syncing&#xff0…

【算法】算法初步

要学好数据结构和算法的设计与分析&#xff0c;请务必先打好C语言基础&#xff0c;因为C语言中的数据存储、内存映射、指针等等概念最接近计算机的底层原理&#xff0c;数据结构是数据在内存空间当中的组织形式&#xff0c;而算法则是提供了解决某个问题的一种思路&#xff0c;…

年会抽奖Html

在这里插入图片描述 <!-- <video id"backgroundMusic" src"file:///D:/background.mp3" loop autoplay></video> --> <divstyle"width: 290px; height: 580px; margin-left: 20px; margin-top: 20px; background: url(D:/nianhu…

LLM 实现Malleable 软件

All computer users may soon have the ability to author small bits of code. What structural changes does this imply for the production and distribution of software? 如果每个终端用户都能修改一部分代码&#xff0c; 这个将会对软件的生产和分发有何重大改变&#…

国产编辑器EverEdit - 两种删除空白行的方法

1 使用技巧&#xff1a;删除空白行 1.1 应用场景 用户在编辑文档时&#xff0c;可能会遇到很多空白行需要删除的情况&#xff0c;比如从网页上拷贝文字&#xff0c;可能就会存在大量的空白行要删除。 1.2 使用方法 1.2.1 方法1&#xff1a; 使用编辑主菜单 选择主菜单编辑 …

出租号平台网站系统源码/单合租用模式 提供用户提现功能

这是一款租号平台源码&#xff0c;采用常见的租号模式对接的易支付。目前网络上还很少见到此类类型的源码。 程序采用thinkphp6.0开发&#xff0c;前端采用layui 程序开发&#xff1a;PHPMySQL 程序演示&#xff1a;zh1.yetukeji.top, 账户 13112215717 &#xff0c;密码qq2…

C++:位与运算符

& 一&#xff0c;位与运算符的运算规则 有0则0。 二&#xff0c;判断奇偶性 %&#xff1a;优先级高&#xff0c;效率低 &&#xff1a;优先级低&#xff0c;效率高 数与1的位与运算结果为1则为奇数&#xff0c;结果为0则为偶数 三&#xff0c;获取一个数二进制的后…

第 31 章 - 源码篇 - Elasticsearch 写入流程深入分析

写入源码分析 接收与处理 请求首先会被 Netty4HttpServerTransport 接收&#xff0c;接着交由 RestController 进行路由分发。 private void tryAllHandlers(final RestRequest request, final RestChannel channel, final ThreadContext threadContext) throws Exception {…

C语言----指针

目录 1.概念 2.格式 3.指针操作符 4.初始化 1. 将普通变量的地址赋值给指针变量 a. 将数组的首地址赋值给指针变量 b. 将指针变量里面保存的地址赋值给另一个指针变量 5.指针运算 5.1算术运算 5.2 关系运算 指针的大小 总结&#xff1a; 段错误 指针修饰 1. con…

Java高频面试之SE-09

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本牛马baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; final关键字有什么作用&#xff1f; 在 Java 中&#xff0c;final 关键字有多个用途&#xff0c;它可以用于类、方法和变量。根据使用的上…

ChatGPT 主流模型GPT-4/GPT-4o mini的参数规模是多大?

微软论文又把 OpenAI 的机密泄露了&#xff1f;&#xff1f;在论文中明晃晃写着&#xff1a; o1-preview 约 300B&#xff1b;o1-mini 约 100BGPT-4o 约 200B&#xff1b;GPT-4o-mini 约 8BClaude 3.5 Sonnet 2024-10-22 版本约 175B微软自己的 Phi-3-7B&#xff0c;这个不用约…

某纪检工作委员会视频监控网络综合运维项目

随着某纪检工作委员会信息化建设的不断深入&#xff0c;网络基础设施的数量持续增加&#xff0c;对网络设备的运维管理提出了更为复杂和艰巨的要求。为了确保这些关键信息基础设施能够安全稳定地运行&#xff0c;该纪检工作委员会决定引入智能化运维管理系统&#xff0c;以科技…

显示器太薄怎么用屏幕挂灯?使用前先了解屏幕挂灯的最佳角度

人们对用眼健康的重视以及数字化办公和娱乐的普及&#xff0c;屏幕挂灯作为一种能够有效减少屏幕反光、保护眼睛的照明设备&#xff0c;受到了越来越多消费者的青睐。随着科技的进步&#xff0c;显示器设计日益轻薄&#xff0c;为我们的桌面节省了空间并带来了美观的视觉效果。…

HTTP/HTTPS ②-Cookie || Session || HTTP报头

这里是Themberfue 上篇文章介绍了HTTP报头的首行信息 本篇我们将更进一步讲解HTTP报头键值对的含义~~~ ❤️❤️❤️❤️ 报头Header ✨再上一篇的学习中&#xff0c;我们了解了HTTP的报头主要是通过键值对的结构存储和表达信息的&#xff1b;我们已经了解了首行的HTTP方法和UR…

excel快速计算周数的方法

业务中经常要通过周汇总计算&#xff0c;为方便后续汇总在源数据引入“周”列 公式&#xff1a; "W"&IF((ROW()1)/7<1,1,ROUNDUP((ROW()1)/7,0))函数释义&#xff1a; ①一周有7天&#xff0c;如果1月1号刚好是从周一开始&#xff0c;那么计算周数可以简单得…

redis各种数据类型介绍

Redis 是一种高性能的键值存储数据库&#xff0c;它支持多种数据类型&#xff0c;使得开发者可以灵活地存储和操作数据。以下是 Redis 支持的主要数据类型及其介绍&#xff1a; 1. 字符串&#xff08;String&#xff09; 字符串是 Redis 中最基本的数据类型&#xff0c;它可以存…

Python 模块,包(详解)

一. 引用变量 引用变量&#xff1a;值的传递通常可以分为两种方式&#xff0c;一种是值的传递&#xff0c;一种是引用地址传递&#xff0c;在Python中一般都是用引用地址传递 变量名和对象&#xff1a;变量名&#xff08;如 a&#xff09;和它指向的对象&#xff08;如整数 5&a…

RabbitMQ发布确认高级篇(RabbitMQ Release Confirmation Advanced Edition)

系统学习消息队列——RabbitMQ的发布确认高级篇 简介 ‌RabbitMQ是一个开源的消息代理软件&#xff0c;实现了‌高级消息队列协议&#xff08;AMQP&#xff09;‌&#xff0c;主要用于在分布式系统中进行消息传递。RabbitMQ由‌‌Erlang语言编写&#xff0c;具有高性能、健壮…