题目描述
计算机中的文件都是由一串01串组成的,我们可以通过某种方式压缩它。
我们可以用一个十进制数串(长度不超过1000),代表一个长度不超过8000的01串。例如十进制串15 1 128代表01串00001111 00000001 10000000。01串可以划分成连续的片段(即连续成段的0或1),如上例可划分成0000 1111 0000000 11 0000000五个片断。我们可以用一个字节(8位)的二进制表示一个片断,表示方法为:字节的最高位代表此片段的颜色是0还是1,低7位代表此片段的长度,所以上例就可以表示为:00000100 10000100 00000111 10000010 00000111。注意到现在有5个字节,每个字节可以用一个不超过255的十进制数表示,所以我们又可以把它表示成4 132 7 130 7。
我们再看看整个编码压缩过程:
15 1 128
00001111 00000001 10000000
0000 1111 0000000 11 0000000
00000100 10000100 00000111 10000010 00000111
4 132 7 130 7
可以保证所有输入数据连续的0或1片段的长度均小于128。
输入
输入数据只有一行,第一个数N是一个可被8整除的不大于8000的自然数,代表编码的01串长度。接下来N/8个十进制整数。
输出
输出只有一行,输出最后的十进制压缩编码。
样例输入
24 15 1 128
样例输出
4 132 7 130 7
按照题意处理即可:
AC代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | #include<iostream> #include<string> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int main() { int n,a[4001],cut,sum,t[4001],rp,oo; string c,q,b; while (cin>>n) { string c,q,b; for ( int i=0;i<n/8;i++) { cin>>a[i]; string q; do { q+=a[i]%2+ '0' ; a[i]=a[i]/2; } while (a[i]>0); reverse(q.begin(),q.end()); for ( int j=8;j>q.length();j--) { c+= '0' ; } c+=q; } //cout<<c<<endl; //string b; for ( int i=0;i<c.length();i++) { string q; cut=1; b+=c[i]; //cout<<b<<endl; while (c[i]==c[i+1]) { cut++; i++; } //cout<<cut<<endl; do { q+=cut%2+ '0' ; cut=cut/2; } while (cut>0); reverse(q.begin(),q.end()); //cout<<q.length()<<endl; for ( int j=7;j>q.length();j--) { b+= '0' ; } b+=q; } //cout<<b<<endl; for ( int i=0,j=0;i<b.length();i+=8,j++) { rp=0; for ( int m=i;m<i+8;m++) { rp+= pow (2,7-m%8)*(b[m]- '0' ); } t[j]=rp; oo=j; } //cout<<oo<<endl; for ( int i=0;i<=oo;i++) { printf ( "%d%c" ,t[i],i<oo? ' ' : '\n' ); } } return 0; } /************************************************************** Problem: 1598 User: 201644901023 Language: C++ Result: 正确 Time:0 ms Memory:2208 kb ****************************************************************/ |