NOIP信息奥赛--1995“同创杯”初中复赛题题解(四)
NOI’95 “同創杯”全國青少年信息學(計算機)奧林匹克競賽
分區聯賽復賽測試數據(初中組)
第四題
問題:
編碼問題:設有一個數組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中的原數據。
輸出:
①由數組求編碼:共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)
②由編碼求原數組:共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)
解析
本題的是編碼類型的題,難點在加解密的算法設計上。
首先要搞清楚加解密的原理,然后在進行程序上的設計。
相對而言,這道題加密的理解比較容易,解密是逆向推導,相對復雜了些。
具體代碼:
#include <QCoreApplication> #include<iostream> #include<time.h> using namespace std;#define MAXN 100int srcArray[MAXN]; //原文數組int codeArray[MAXN]; //加密后產生的數組int decodeArray[MAXN]; //解密后的數組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); // 產生隨機數列GetCode(srcArray,codeArray,size); //加密printArray(codeArray,size,CODEMODE); //打印密文GetDecode(codeArray,decodeArray,size); //解密printArray(decodeArray,size,DECODEMODE); //打印解密后的原文return a.exec(); }// 隨機產生個數為size的不同的數 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個隨機數srand((unsigned)time(NULL));k = (int)rand() % size;//k為下標//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]; //參考數組for (int i = 0; i < size; i++){conf[i] = i;}arrayB[size-1] = arrayA[size-1]; //確定最后一位數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; }程序編譯后輸出:
總結
以上是生活随笔為你收集整理的NOIP信息奥赛--1995“同创杯”初中复赛题题解(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NOIP信息奥赛--1995“同创杯”初
- 下一篇: 算法解读 ---- 递归(一)