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;
}
时间: 2024-08-27 13:35:13

NOIP 编码问题的相关文章

BZOJ1005--[HNOI2008]明明的烦恼(树的prufer编码)

1005: [HNOI2008]明明的烦恼 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5768  Solved: 2253[Submit][Status][Discuss] Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N(0 < N < = 1000), 接下来N行,第i+1行给出第i个节

迟到的NOIP游记

呃......看标题就知道不对劲是吧....... 好吧这要到一个月之前..... 双11前(NOIP2017pj)lz说"很简单的,一等不难,只要你把*******(和谐掉)打熟,然后********(其实是忘了也就是有好好认真准备的意思)"...... 然后像我这么辣鸡的楞还不好好努力......... (上面怎么每一行都是......) 在这之前我们有集训,我也参加了.lz说每天晚上最好都腾一点时间刷题打模板什么的...... However 我之前每天作业都写到12点后/喷血.

Python中编码的详细讲解

看这篇文章前,你应该已经知道了为什么有编码,以及编码的种类情况 ASCII 占1个字节,只支持英文 GB2312 占2个字节,支持6700+汉字 GBK GB2312的升级版,支持21000+汉字 Shift-JIS 日本字符 ks_c_5601-1987 韩国编码 TIS-620 泰国编码 由于每个国家都有自己的字符,所以其对应关系也涵盖了自己国家的字符,但是以上编码都存在局限性,即:仅涵盖本国字符,无其他国家字符的对应关系.应运而生出现了万国码,他涵盖了全球所有的文字和二进制的对应关系, U

java编码规范

右括号") "与其后面的关键字之间,关键字与其后面的左括号"("或"{"之间,以及"}"与"{"之间,要以一个空格隔开:除". "外,所有二元操作符的前.后要加空格:在逗号后边加一个空格. 说明: 一个紧跟着括号的关键词应该被空格分开: 空白应该位于参数列表中逗号的后面: 所有的二元运算符,除了".",应该使用空格将之与操作数分开.一元操作符和操作数之间不应该加空格,

微信实现定位城市并获取城市编码

最近在做一个项目是将用户的当前所在市县定位出来并展示在手机端页面,同时还要获取到该市县的城市编码从而进行数据过滤,这里重点讲定位城市及获取城市编码 前端页面代码: 首先引用腾讯地图的一个js <script type="text/javascript" src="https://3gimg.qq.com/lightmap/components/geolocation/geolocation.min.js" ></script> 同时在页面加载

python字符编码

1. 字符编码简介 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符 ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符) 后来为了将拉丁文也编码进了ASCII表,将最高位也占用了 阶段二:为了满足中文,中国人定制了GBK GBK:2Bytes代表一个字符 为了满

刨根究底字符编码之十二——UTF-8究竟是怎么编码的

UTF-8究竟是怎么编码的 1. UTF-8编码是Unicode字符集的一种编码方式(CEF),其特点是使用变长字节数(即变长码元序列.变宽码元序列)来编码.一般是1到4个字节,当然,也可以更长. 为什么要变长呢?这可以理解为按需分配,比如一个字节足以容纳所有的ASCII码字符,那何必补一堆0用更多的字节来存储呢? 实际上变长编码有其优势也有其劣势,优势是节省空间.自动纠错性能好.利于传输.扩展性强,劣势是不利于程序内部处理,比如正则表达式检索:而UTF-32这样等长码元序列(即等宽码元序列)的

Huffman树与编码

带权路径最小的二叉树称为最优二叉树或Huffman(哈夫曼树). Huffman树的构造 将节点的权值存入数组中,由数组开始构造Huffman树.初始化指针数组,指针指向含有权值的孤立节点. b = malloc(n*sizeof(BTreeNode)); for (i = 0; i < n; i++) { b[i] = malloc(sizeof(BTreeNode)); b[i]->data = a[i]; b[i]->left = NULL; b[i]->right = NU

转 常见视频编码方式以及封装格式

常见视频编码方式以及封装格式 常见视频编码方式 所谓视频编码方式就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式.视频流传输中最为重要的编解码标准有国际电联的H.261.H.263.H.264.H.265,运动静止图像专家组的M-JPEG和国际标准化组织运动图像专家组的MPEG系列标准,此外在互联网上被广泛应用的还有Real-Networks的RealVideo.微软公司的WMV以及Apple公司的QuickTime等. AVI AVI 是 Audio Video I