ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

T239493 [AHOI2002]黑白图像压缩 200141530-高清影

2022-05-14 19:31:55  阅读:133  来源: 互联网

标签:片段 AHOI2002 字节 200141530 int 像素 图像压缩 图像 序列


题目描述

选修基础生物基因学的时候, 小可可在家里做了一次图像学试验。 她知道:整个图像其实就是若干个图像点(称作像素)的序列,假定序列中像素的个数总是 8 的倍数, 于是每八个像素可以转换成一个叫做字节的数, 从而这个表示图像的像素序列就被转换成了字节的序列。

所谓的字节就是一个八位的二进制数(当然,为了便于书写,人们经常用它的十进制形式来表示)。这八个像素从前向后依次对应于字节从高位到低位的八个位, 用 0 来表示白色像素、 1 来表示黑色像素。 这种表示方法叫做位图法。 例如字节序列 210、 0、255 表示了 8*3=24 个像素, 由于对应的二进制形式是 11010010、 00000000、11111111, 所以这 24 个像素的颜色依次是黑、 黑、 白、 黑、 白、 白、 黑、 白、白、白、白、白、白、白、白、白、黑、黑、黑、黑、黑、黑、黑、黑。

小可可想: 其实图像中存在着很多连续的同色像素段, 也许换一种方式表达图像能够减少图像的数据量。 她的思路是: 把像素按照颜色分成若干个片段, 同一个片段中各像素颜色相同, 且连续的同色像素都在同一个片段中。同时已知每个片段的最大长度小于 128。

每一个像素片段都是用一个二进制字节量来表示, 最高位表示片段中像素的颜色, 而低七位表示片段中像素的数目。注意:不存在长度为 0 的像素片段。这种表示法叫做像素片段法。

例如位图表示法的字节序列 210、 0、 255 对应的像素序列可以分成七个片段,分别是: 11、 0、 1、 00、 1、 000000000、 11111111。如果用像素片段法来表示的话,二进制字节序列应该写成 10000010、 00000001、 10000001、00000010、 10000001、 00001001、 10001000, 而其对应于十进制字节序列就是 130、 1、 129、 2、 129、 9、 136。

像素片段法是否能有效地减少图像的数据存储量呢?小可可不知道如何用数学的方法加以证明, 于是决心对手头上的图像做些试验, 看看该方法是否真的有效。 请你编写程序完成图像信息的转换, 以协助小可可完成这项试验。

输入格式

文件中以一行的形式存放了一个图像的信息。第一个数是正整数 nn ,表明该图像有 nn 个像素。随后有 \frac{n}{8}8n​ 个十进制形式的字节量,表示该图像的位图信息。相邻数之间用一个空白字符隔开。

输出格式

以一行的形式输出以像素片段表示法表示的图像信息,各个数都以

十进制的形式出现,相邻数之间用一个空白字符隔开。

输入输出样例

输入 #1
8 0
输出 #1
8
输入 #2
24 210 0 255
输出 #2
130 1 129 2 129 9 136

说明/提示

1\leq n\leq 8\times 10^41≤n≤8×104。

 

 

还好,终于有一题能自己做的题了。

 

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 
 6 int main()
 7 {
 8     int *a,*b,m,n,j,i,k=1,*c;
 9     int tap;
10     cin>>m;
11     n=m/8;
12     a=new int[n+1];
13     b=new int[n*8+1];
14     for(i=0;i<n;i++)
15         cin>>a[i];
16 
17 
18     for(j=0;j<n;j++)
19     {
20        for(i=j*8+7;i>=j*8;i--)
21     {
22         b[i]=a[j]%2;
23         a[j]=a[j]/2;
24        // cout<<b[i];
25     }
26     //cout<<endl;
27    // cout << a[j] << endl;
28     }
29    // for(i=0;i<24;i++)cout<<b[i];
30     for(i=0;i<24;i++)
31     {
32         k=1;
33         if(b[i]==0)
34         {
35 
36             for(i=i+1;i<24;i++)
37             {
38                 if(b[i]==0)k++;
39                 else {i--;
40                       break;
41                       }
42             }
43             cout<<k<<" ";
44 
45         }
46         else
47         {
48 
49             for(i=i+1;i<24;i++)
50             {
51                 if(b[i]==1)k++;
52                 else {i--;
53                       break;
54                       }
55 
56             }
57             cout<<k+128<<" ";
58         }
59     }
60     delete []b;
61     delete []a;
62     return 0;
63 }

 

标签:片段,AHOI2002,字节,200141530,int,像素,图像压缩,图像,序列
来源: https://www.cnblogs.com/gqy-Elizabeth/p/16271078.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有