[NOIP1995]编码问题

设有一个数组 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)。
程序要求解决以下问题:
1,给出数组A后,求出其编码;
2,给出数组A的编码后,求出A中的原数据。

输入格式
第一行,一个整数 n(n≤10),表示数组的大小。第二行为字母 A 或者 B,为 A 表示任务 1,为 B 表示任务 2。第三行为 n个整数,即数组 A 或者其编码。

输出格式
只有一行为 n个整数,即数组 A 或者其编码。(视输入给出的任务而定)

样例输入
6
A
3 4 1 5 2 0

样例输出
0 1 0 3 1 0

#include<stdio.h>
#include<string.h>

int main(){
    int n;
    char r;
    scanf("%d",&n);//输入n
    getchar();
    scanf("%c",&r);//输入A或B
    int a[n];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);//输入数组或编码
    }
    int b[n],c[n];
    memset(b,0,sizeof(b));//对b数组初始化
    memset(c,0,sizeof(c));//对c数组初始化
    if(r=='A'){//任务一
        for(int i=1;i<n;i++){
            int min=a[i];//假设最小值
            int num=0;
            for(int j=0;j<i;j++){
                if(a[j]<min) num++;//判断0到i-1中比i小的数的个数
            }
            b[i]=num;//存入输出数组
        }
        for(int i=0;i<n;i++){
            printf("%d ",b[i]);//输出b
        }
    }
    else{//任务二
        for(int i=n-1;i>=0;i--){//从后往前推
            int cnt=0;//记录个数
            for(int j=0;j<n;j++){
                if(cnt==a[i]&&!c[j]){//如果满足个数,且本身没有被标记
                    b[i]=j;//存入
                    c[j]=1;//添上标记
                    break;
                }
                if(!c[j]) cnt++;//找符合的个数
            }
        }
        for(int i=0;i<n;i++){
            printf("%d ",b[i]);//输出b
        }
    }
    return 0;
}

任务二比任务一难,要从后往前推,因为是找之前比它小的数的个数。

全部评论

相关推荐

投递腾讯云智研发等公司10个岗位
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务