2312 - 编码问题

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 125 MB

设有一个数组 A:ARRAY[0..N-1] OF INTEGER;数组中存放的元素为0N-1之间的整数,且A[i]A[j](当ij时)。

例如:

       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=12……N-1

    ∴上面数组A的编码为:B=(0,0,0,3,1,2)

程序要求解决以下问题:

①   给出数组A后,求出其编码;

②   给出数组A的编码后,求出A中的原数据。


<br />

题目输入

每个测试文件只包含一组测试数据,每组输入包含三行。

第一行输入整数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)

输出格式

B=(0,0,0,3,1,2)

C语言解答

#include<stdio.h>
int main()
{  //freopen("in.txt","r",stdin);
int n,i=0,j,x[1000],flag[1000]={0},fz[1000],sc[1000];
   scanf("%d",&n);
  char c,d;
  getchar();
   c=getchar();
    while(d=getchar())
	{if('0'<=d&&d<='9') x[i++]=d-'0';if(d==')') break;}
   for(i=0;i<n;i++) fz[i]=i;
   if(c=='A')
   {
	   for(i=0;i<n;i++)
	   {
           int count=0;
		   for(j=0;j<i;j++)
				if(x[j]<x[i]) ++count;
			sc[i]=count;
	   }
	   printf("B=(");
	   for(i=0;i<n;i++)
		   if(i!=n-1) printf("%d,",sc[i]);else printf("%d)\n",sc[i]);
   }
   else
   {
	   for(i=n-1;i>=0;i--)
	   {
		   int j=0,count =0;
		   for(count;count<=x[i];)
			{
				if(flag[j++]==0) count++;

			}
		   sc[i]=fz[j-1];flag[j-1]=1;
	   }
	   printf("A=(");
	   for(i=0;i<n;i++)
		   if(i!=n-1) printf("%d,",sc[i]);else printf("%d)\n",sc[i]);

   }
   return 0;
}


C++解答

#include<stdio.h>
int main()
{  //freopen("in.txt","r",stdin);
int n,i=0,j,x[1000],flag[1000]={0},fz[1000],sc[1000];
   scanf("%d",&n);
  char c,d;
  getchar();
   c=getchar();
    while(d=getchar())
	{if('0'<=d&&d<='9') x[i++]=d-'0';if(d==')') break;}
   for(i=0;i<n;i++) fz[i]=i;
   if(c=='A')
   {
	   for(i=0;i<n;i++)
	   {
           int count=0;
		   for(j=0;j<i;j++)
				if(x[j]<x[i]) ++count;
			sc[i]=count;
	   }
	   printf("B=(");
	   for(i=0;i<n;i++)
		   if(i!=n-1) printf("%d,",sc[i]);else printf("%d)\n",sc[i]);
   }
   else
   {
	   for(i=n-1;i>=0;i--)
	   {
		   int j=0,count =0;
		   for(count;count<=x[i];)
			{
				if(flag[j++]==0) count++;

			}
		   sc[i]=fz[j-1];flag[j-1]=1;
	   }
	   printf("A=(");
	   for(i=0;i<n;i++)
		   if(i!=n-1) printf("%d,",sc[i]);else printf("%d)\n",sc[i]);

   }
   return 0;
}

Python解答

def fmin(a, n):
	a.sort()
	return a.pop(int(n))

def func(a):
	s = ""
	if a[0] == "A":
		s = "B=(0,"
		for x in xrange(1,len(a[1])):
			c = 0
			for i in xrange(0,x):
				c += a[1][i] < a[1][x]
			s += str(c) + [')', ','][x < len(a[1]) - 1]
	elif a[0] == "B":
		s = "A=("
		t = []
		b = [i for i in xrange(0, len(a[1]))]
		for x in xrange(len(a[1]) - 1, -1, -1):
			t.append(fmin(b, a[1][x]))
		t.reverse()
		for x in xrange(0,len(t)):
			s += str(t[x]) + [')', ','][x < len(t) - 1]
	return s

n = raw_input()
while (n):
	s = raw_input()
	a = [s[0], s[3:len(s) - 1].split(",")]
	print func(a)
	n = raw_input()