• 编码问题


    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;
    }
  • 相关阅读:
    【代码片段】双语导航/导航中鼠标经过变换文字
    【代码片段】渐变写法
    as3.0 复习一
    【代码片段】as3.0 鼠标指针更换代码
    二班信息管理系统
    ubuntu server下apache安装配置以及优化(摘录)
    bootstrap,好东西,对于后端开发人员是个解脱
    今天发现staff邮箱在用LDAP
    FastCGI及PHPFPM
    推荐vi配置及说明
  • 原文地址:https://www.cnblogs.com/wjw2018/p/9334537.html
Copyright © 2020-2023  润新知