NOIP信息奥赛--1995“同创杯”初中复赛题题解(四)
NOI’95 “同創(chuàng)杯”全國青少年信息學(xué)(計(jì)算機(jī))奧林匹克競(jìng)賽
分區(qū)聯(lián)賽復(fù)賽測(cè)試數(shù)據(jù)(初中組)
第四題
問題:
編碼問題:設(shè)有一個(gè)數(shù)組A:ARRAY[0…N-1] OF INTEGER;數(shù)組中存放的元素為0~N-1之間的整數(shù),且A[i]≠A[j](當(dāng)i≠j時(shí))。
例如:N=6時(shí),有: A=(4,3,0,5,1,2)
此時(shí),數(shù)組A的編碼定義如下:
A[0]的編碼為0;
A[i]的編碼為:在A[0],A[1],……A[i-1]中比A[i]的值小的個(gè)數(shù)(i=1,2……N-1)
∴上面數(shù)組A的編碼為: B=(0,0,0,3,1,2)
程序要求解決以下問題:
①給出數(shù)組A后,求出其編碼;
②給出數(shù)組A的編碼后,求出A中的原數(shù)據(jù)。
輸出:
①由數(shù)組求編碼:共15分(5%+5%+5%)
a 輸入:N=6 A=(0,1,2,3,4,5)
輸出: B=(0,1,2,3,4,5)
b 輸入:N=6 A=(5,4,3,2,1,0)
輸出: B=(0,0,0,0,0,0)
c 輸入:N=8 A=(1,0,3,2,5,4,7,6)
輸出: B=(0,0,2,2,4,4,6,6)
②由編碼求原數(shù)組:共15分(5%+5%+5%)
a 輸入:N=5 B=(0,0,0,0,0)
輸出: A=(4,3,2,1,0)
b 輸入:N=10 B=(0,1,2,3,4,5,6,7,8,9)
輸出: A=(0,1,2,3,4,5,6,7,8,9)
c 輸入:N=7 B=(0,0,0,0,4,5,6)
輸出: A=(3,2,1,0,4,5,6)
解析
本題的是編碼類型的題,難點(diǎn)在加解密的算法設(shè)計(jì)上。
首先要搞清楚加解密的原理,然后在進(jìn)行程序上的設(shè)計(jì)。
相對(duì)而言,這道題加密的理解比較容易,解密是逆向推導(dǎo),相對(duì)復(fù)雜了些。
具體代碼:
#include <QCoreApplication> #include<iostream> #include<time.h> using namespace std;#define MAXN 100int srcArray[MAXN]; //原文數(shù)組int codeArray[MAXN]; //加密后產(chǎn)生的數(shù)組int decodeArray[MAXN]; //解密后的數(shù)組enum {CODEMODE = 0, DECODEMODE =1};void GetRandom(int * random,int size); void GetCode(int *arrayA,int *arrayB,int size); void GetDecode(int *arrayA,int *arrayB,int size);void printArray(int *parray,int size,int mode);int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);cout<<"Hello NOIP!"<<endl;cout<<"Enter the size of array:"<<endl;int size = 0;cin >>size;cout<< "The size of array is:"<<size<<endl;GetRandom(srcArray,size); // 產(chǎn)生隨機(jī)數(shù)列GetCode(srcArray,codeArray,size); //加密printArray(codeArray,size,CODEMODE); //打印密文GetDecode(codeArray,decodeArray,size); //解密printArray(decodeArray,size,DECODEMODE); //打印解密后的原文return a.exec(); }// 隨機(jī)產(chǎn)生個(gè)數(shù)為size的不同的數(shù) void GetRandom(int *random,int size) {int i, j[size], k;for (i = 0; i < size; i++){j[i] = i;}for(i = 0; i < size; i++){//生成第i個(gè)隨機(jī)數(shù)srand((unsigned)time(NULL));k = (int)rand() % size;//k為下標(biāo)//cout<<k<<" ";while (j[k] == -1){k = (k + 1) % size;}random[i] = j[k];cout<< random[i]<< " ";j[k] = -1;}cout<<endl; }//加密算法 void GetCode(int *arrayA,int *arrayB,int size) {arrayB[0]=0;int cnt = 0;for(int i = 1;i<size;i++){for(int j = 0;j<i;j++){if(arrayA[j]<arrayA[i]){cnt++;arrayB[i] = cnt;}}cnt = 0;// cout<< "The coded is:"<<arrayB[i]<<" ";} }//解密算法void GetDecode(int *arrayA,int *arrayB,int size) {int conf[size]; //參考數(shù)組for (int i = 0; i < size; i++){conf[i] = i;}arrayB[size-1] = arrayA[size-1]; //確定最后一位數(shù)int temp = arrayB[size-1];conf[temp] = -1;int cnt = 0;for(int i = size-2;i>=0;i--){for(int j = 0 ;j<size;j++){if(conf[j]>=0){cnt++;if(cnt == arrayA[i]+1){cnt = j;break;}}}arrayB[i] = conf[cnt];conf[cnt] =-1;cnt = 0;} }void printArray(int *parray,int size,int mode) {if(mode == CODEMODE ){cout<< "The coded is:"<<endl;}else{cout<< "The decoded is:"<<endl;}for(int i=0;i<size;i++ ){cout<<parray[i]<<" ";}cout<<endl; }程序編譯后輸出:
總結(jié)
以上是生活随笔為你收集整理的NOIP信息奥赛--1995“同创杯”初中复赛题题解(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NOIP信息奥赛--1995“同创杯”初
- 下一篇: 算法解读 ---- 递归(一)