编码问题

3013: 编码问题

时间限制: 1 Sec  内存限制: 125 MB
提交: 3  解决: 0
[提交][状态][讨论版][命题人:外部导入]

题目描述

设有一个数组 A:ARRAY[0..N-1] OF INTEGER;数组中存放的元素为0~N-1之间的整数,且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的编码后,求出A中的原数据。

 

 

输入

每个测试文件只包含一组测试数据,每组输入包含三行。

第一行输入整数N;

第二行输入有两种可能:

例如:

A=(4,3,0,5,1,2)

B=(0,0,0,3,1,2)

其中输入中的逗号和括号都是英文状态下的。

输出

当输入的是A=(...),则输出其编码。

当输入的是B=(...),则输出A中的原数据。

输出数据的格式和输入数据的格式是一样的。

样例输入

6

A=(4,3,0,5,1,2)

6

B=(0,0,0,3,1,2)

样例输出

B=(0,0,0,3,1,2)

A=(4,3,0,5,1,2)

解题思路:第一种情况求编码很简单,直接开一个for判断每个数前面小于该数的数量就行;

第二种情况求源码稍微复杂了点,需要开一个vis标记一下每个数是否被用过,从后往前找,然后在未被标记中的数中找就可以了,需要两个for循环。然后输入的格式注意一下。

#include<bits/stdc++.h>
using namespace std;

int q[10005];
int w[10005];
int vis[10005];

int main()
{
    int m,n,i,j;
    char a,b,c;
    while(~scanf("%d",&m))
    {
        memset(w,0,sizeof(w));
        memset(vis,0,sizeof(vis));
        cin>>a>>b>>c;
        if(a=='A')
        {
            scanf("%d",&q[1]);
            for(i=2;i<=m;i++)
                scanf(",%d",&q[i]);
            cin>>b;
            for(i=1;i<=m;i++)
                for(j=1;j<i;j++)
            {
                if(q[i]>q[j])
                    w[i]++;
            }
            printf("B=(");
            cout<<w[1];
            for(i=2;i<=m;i++)
                printf(",%d",w[i]);
            printf(")
");
        }
        else if(a=='B')
        {
            scanf("%d",&w[1]);
            for(i=2;i<=m;i++)
                scanf(",%d",&w[i]);
            cin>>b;
            int s;
            for(i=m;i>=1;i--)
               {
                   s=0;
                   for(j=0;j<m;j++)
                   {
                       if(s==w[i]&&!vis[j])
                       {
                           q[i]=j;
                           vis[j]=1;
                           break;
                       }
                        if(!vis[j])
                            s++;
                   }
               }
            printf("A=(");
            cout<<q[1];
            for(i=2;i<=m;i++)
                printf(",%d",q[i]);
            printf(")
");
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wjw2018/p/9334537.html