数据结构 表 逆序数

僤鯓⒐⒋嵵緔 提交于 2019-12-09 17:48:27

算法与数据结构实验题 2.10 逆序数

★实验任务

Nk 最近喜欢上了研究逆序数,给出一个由 1…n 组成的数列 a1,a2,a3…an,

a1的逆序数就是在 a2…an 中,比 a1 小的数的数量,而 a2 的逆序数就是 a3…an 中比 a2
小的数的数量,以此类推。

例如,数列 5,3,4,2,1 的逆序数序列就是 4,2,2,1,0.

那么,如果给出一个数列的逆序数序列,你能不能还原得到他的原数列?

★数据输入

每个测试数据是一个正整数 n。代表数列长度(1<=n<=500),并且原数列中的值的范围是[1,n]。

然后输入 n 个正整数 ai(0<=ai<n)。

★数据输出

输出原始数列,两个数字间中间用空格隔开

分析:
逆序数的意思就是 在当前位置的后面有多少个比他小的数,根据这个性质,就可以做了
由于数列长度只有500 算法复杂度为O(n^2) 一定不会超时

代码如下:

#include<bits/stdc++.h>
#define LL long long
#define ms(s) memset(s, 0, sizeof(s))
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define INF 0X7fffffff
using namespace std;
const int maxn = 5e2 + 10;
bool vis[maxn];

int main() {
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    ms(vis);
    for(int i = 0; i < n ;i++) {
        int x;
        cin >> x;
        int cnt = 0;
        int j;
        vis[0] = true;
        for(j = 0; j <= n; j++) {
            if(!vis[j]) {
                cnt++;
            }
            if(cnt == x) {
                while(vis[++j]);
                vis[j] = true;
                break;
            }
        }
        if(i) cout << " ";
        cout << j;
    }
    return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!