C++题目,还原数列,知道每个数之前有多少个比它小的数,求原先的数列,求大神解答!

【问题描述】
给定1~N的某个排列,可以很容易求出每个数之前有多少个比它小的数。
但反过来,如果知道每个数之前有多少个比它小的数,能否求出原先的排列呢?

【输入数据】(sequence.in)

第一行,N(1<=N<=100)

第二行,N个数,分别表示每个数之前有多少个比它小的数。

【输出数据】(sequence.out)

一行,N个数为所求的原先排列

输入样例

4

0 1 2 1

【样例输出】

1 3 4 2

2个回答

#include <stdio.h>

int main()
{
    int n = 0;
    int arr[101];
    int r[101];
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    int curr = 1;
    for (int i = 0; i < n; i++)
    {
        for (int j = n - 1; j >= 0; j--)
        {
            if (arr[j] == i)
                r[j] = curr++;
        }
    }
    for (int i = 0; i < n; i++)
        printf("%d ", r[i]);
    printf("\n");
    return 0;
}

问题解决的话,请点下采纳,谢谢合作

weixin_43964027
穿胖次的夏雨来 比如我输入的是6个数 ,输入 0 0 1 2 4 0 ,正确答案应该是 5 2 3 4 6 1,当时运行过后却是显示3 2 4 5 6 1
3 个月之前 回复
weixin_43964027
穿胖次的夏雨来 //输入 0 0 1 2 4 0
3 个月之前 回复
weixin_43964027
穿胖次的夏雨来 比如我输入的是6个数
3 个月之前 回复
int num = 6;    // N
vector<int> vecNum(num);    // 1, 2, ..., N 
for (int i = 0; i < num; i++){
    vecNum[i] = i + 1;
}

vector<int> vecInput(num);  // input
vecInput[0] = 0;
vecInput[1] = 0;
vecInput[2] = 1;
vecInput[3] = 2;
vecInput[4] = 4;
vecInput[5] = 0;

vector<int> vecOutput(num); // output
vector<int>::reverse_iterator itOutput = vecOutput.rbegin();
for (vector<int>::reverse_iterator itInput = vecInput.rbegin(); itInput != vecInput.rend(); itInput++) {
    *itOutput++ = vecNum[*itInput];
    vecNum.erase(vecNum.begin() + *itInput);
}

// print
for (vector<int>::iterator it = vecOutput.begin(); it != vecOutput.end(); it++) {
    cout << *it << endl;
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问