NOIP 编码问题
Posted Kuro同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP 编码问题相关的知识,希望对你有一定的参考价值。
题目描述
设有一个数组 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)
如果是求编码B的话 只要两个for循环即可 :
for(i=1;i<=N;i++)
for(j=1;j<i;j++)
而如果是通过编码B求A的话 就需要从后面往前面判断
再用一个for循环从0~N-1 找比他小且后面没出现过的数的个数 若等于b[i] 则找到该数 并标记 出现
#include<iostream>
#include<cstdio>
#include<cstring>
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(")\\n");
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(")\\n");
return 0;
以上是关于NOIP 编码问题的主要内容,如果未能解决你的问题,请参考以下文章