回 帖 发 新 帖 刷新版面

主题:[学习]编码问题

/*
编码问题(95年全国分区联赛题):设有一个数组A:array [0..N-1] of integer;
存放的元素为0~N-1(1<N<=10)之间的整数,且A[i]≠A[j](i≠j)。例
如当N=6时,有:A=(4,3,0,5,1,2)。此时,数组A的编码定义如下:
A[0]编码为0;
A[i]编码为:在A[0],A[1],…,A[i-1]中比A[i]的值小的个数
          (i=1,2,…,N-1)
∴上面数组A的编码为:B=(0,0,0,3,1,2)
    要求编程解决以下问题:

给出数组A的编码后,求出A中的原数据

例:
输入:Stat=2   {表示要解决的第(2)问题}
       N=7
       B=0 1 0 0 4 5 6
输出:A=2 3 1 0 4 5 6
*/
/*
解法:先构建数组P,初始值为0,1,2,3,……,N-1。然后从B[N-1],B[N-2],……,B[1],B[0]
逆向从数组P中取数求数组A。以题中例二为例,求解过程如下图:
下标值i    B0 B1 B2  B3 B4  B5 B6
p0 p1 p2  p3 p4  p5  p6    数组A
   6
    0 1  0  0  4  5  6
                ↑    0  1  2  3  4  5  6

A[6]=p[B6]=p6=6,划去p6
   5    0 1  0  0  4  5  6
             ↑        0  1  2  3  4  5

A[5]=p[B5]=p5=5,划去p5
   4
    0 1  0  0  4  5  6
          ↑          0  1  2  3  4

A[4]=p[B4]=p4=4,划去p4
   3
    0 1  0  0  4  5  6
       ↑             0  1  2  3

A[3]=p[B3]=p0=0,划去p0
   2
    0 1  0  0  4  5  6
    ↑                1  2  3

A[2]=p[B2]=p0=1,划去p0
   1
    0 1  0  0  4  5  6
 ↑                   2  3

A[1]=p[B1]=p1=3,划去p2
   0
    0 1  0  0  4  5  6
↑                     2

A[0]=p[B0]=p0=2
    从上述求解过程中,我们得到:A=(2,3,1,0,4,5,6)。
*/
#include <iostream>

using namespace std;

void decode (int code[], int A[], int n)
{
    int * const p = new int[n];

    for (int i = 0; i < n; ++i)
        p[i] = i;
    for (int i = n - 1; i >= 0; --i) {
        A[i] = p[code[i]];
        // delete p[code[i]] from list
        for (int j = code[i]; j < i; ++j)
            p[j] = p[j + 1];
    }

    delete []p;
}

int main ()
{
    const int N = 7;
    int code[N] = {0,1,0,0,4,5,6};
    int A[N];

    decode (code, A, N);
    for (int i = 0; i < N; ++i)
        cout << A[i] << ' ';
    cout << endl;
    system ("pause");
    return 0;
}

回复列表 (共1个回复)

沙发

恩,不错。
看头像,我还以为是美女姐姐呢。。。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册