设有一个数组 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中的原数据。
#include<bits/stdc++.h>//不要用万能头!!!
using namespace std;
int num;
int main(){
int a[19999];//大数组尽量定义到主函数外;
int n;
char ab;//记录第一个字符
string zry;
cin>>n;
cin>>zry;//输入一串字符
ab=zry[0];//问题1还是2,看第一个字符是A还是B
for(int i=0;i<zry.size();i++){
if(zry[i]>='0'&&zry[i]<='9'){//判断这个字符是不是数字
a[num]=zry[i]-48;//是,就存起来
num++;//
}
}//这串代码就是提取字符串中的数字
if(ab=='A'){//问题一
int x=0;//记比a【i】小的数
int b[1000];
for(int i=0;i<n;i++){
b[i]=a[i];
}//存原数组,因为判断数组a的编码后,后面的数也要判断
a[0]=0;//第一个数前肯定没有比它小,所以为0
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(b[j]<a[i]){
x++;
}
}
a[i]=x;
x=0;//要初始化
}//其实这里用倒序更简单,因为不会影响到下一步判断,这串代码不好
cout<<"B=(";//问题一,二输出的不一样
}//对着规律推
if(ab=='B'){//问题二
int c[1000];
int b[1000];
for(int i=n-1;i>=0;i--){
b[i]=i;//记录
}
for(int i=n-1;i>=0;i--){//要从后面算,不然麻烦!!!
c[i]=b[a[i]];//因为是前面比自己小的数,又没重复,所以直接求数
b[a[i]]=100000;
sort(b,b+n);//去除b[a[i]] ,最好用vector
}
for(int i=0;i<n;i++){
a[i]=c[i];
}//最后赋给数组a
cout<<"A=(";
}//这题要倒推编码规律
for(int i=0;i<n-1;i++){
cout<<a[i]<<',';//要注意最后一个数没有“,”
}
cout<<a[n-1]<<")";
return 0;
}