3013: 编码问题
时间限制: 1 Sec 内存限制: 125 MB
提交: 3 解决: 0
[提交][状态][讨论版][命题人:外部导入]
题目描述
设有一个数组 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中的原数据。
输入
每个测试文件只包含一组测试数据,每组输入包含三行。
第一行输入整数N;
第二行输入有两种可能:
例如:
A=(4,3,0,5,1,2)
或
B=(0,0,0,3,1,2)
其中输入中的逗号和括号都是英文状态下的。
输出
当输入的是A=(...),则输出其编码。
当输入的是B=(...),则输出A中的原数据。
输出数据的格式和输入数据的格式是一样的。
样例输入
6
A=(4,3,0,5,1,2)
6
B=(0,0,0,3,1,2)
样例输出
B=(0,0,0,3,1,2)
A=(4,3,0,5,1,2)
解题思路:第一种情况求编码很简单,直接开一个for判断每个数前面小于该数的数量就行;
第二种情况求源码稍微复杂了点,需要开一个vis标记一下每个数是否被用过,从后往前找,然后在未被标记中的数中找就可以了,需要两个for循环。然后输入的格式注意一下。
#include<bits/stdc++.h> using namespace std; int q[10005]; int w[10005]; int vis[10005]; int main() { int m,n,i,j; char a,b,c; while(~scanf("%d",&m)) { memset(w,0,sizeof(w)); memset(vis,0,sizeof(vis)); cin>>a>>b>>c; if(a=='A') { scanf("%d",&q[1]); for(i=2;i<=m;i++) scanf(",%d",&q[i]); cin>>b; for(i=1;i<=m;i++) for(j=1;j<i;j++) { if(q[i]>q[j]) w[i]++; } printf("B=("); cout<<w[1]; for(i=2;i<=m;i++) printf(",%d",w[i]); printf(") "); } else if(a=='B') { scanf("%d",&w[1]); for(i=2;i<=m;i++) scanf(",%d",&w[i]); cin>>b; int s; for(i=m;i>=1;i--) { s=0; for(j=0;j<m;j++) { if(s==w[i]&&!vis[j]) { q[i]=j; vis[j]=1; break; } if(!vis[j]) s++; } } printf("A=("); cout<<q[1]; for(i=2;i<=m;i++) printf(",%d",q[i]); printf(") "); } } return 0; }