算法与数据结构实验题 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;
}
来源:CSDN
作者:樂_smile
链接:https://blog.csdn.net/Inuyasha__/article/details/103460539