1. 程式人生 > >HNUSTOJ-1520 壓縮編碼

HNUSTOJ-1520 壓縮編碼

else 解決 ref stat 狀態 規則 記錄 mes names

1520: 壓縮編碼

時間限制: 1 Sec 內存限制: 2 MB
提交: 107 解決: 54
[提交][狀態][討論版]

題目描述

  某工業監控設備不斷發回采樣數據。每個數據是一個整數(0到1000之間)。各個數據間用空白字符(空格,TAB或回車換行)分隔。   因為大多數時候,相鄰的采樣間隔數據是相同的,可以利用這個特征做數據的壓縮存儲。其方法是:對n(n>1)個連續相同的數字只記錄n和該數字本身;對m(m>0)個連續不重復的數字,則記錄 m*-1 和這些數字本身(之所以用負數,是為了與第一種情況區分,便於解壓縮)。 例1: 假設采樣數據為: 12 34 34 25 25 25 25 11 15 17 28 14 22 22 22
則將上述采樣數據按照上述規則進行壓縮編碼後的數據為: -1 12 2 34 4 25 -5 11 15 17 28 14 3 22 例2: 假設采樣數據為: 12 13 14 13 12
則將上述采樣數據按照上述規則進行壓縮編碼後的數據為: -5 12 13 14 13 12 例3: 假設采樣數據為: 66 66 66 66 66 88 88 88 88 88 88 88 88 88 88 88
則將上述采樣數據按照上述規則進行壓縮編碼後的數據為: 5 66 11 88

輸入

先輸入采樣數據的個數n(1<=n<=10000)。

然後輸入n個采樣數據。每個數據是一個整數(0到1000之間,包括0和1000本身)。各個數據間用空白字符(空格,TAB或回車換行)分隔。

輸出

輸出按規則進行壓縮編碼後的數據,數據之間用一個空格隔開。

註意,最後一個輸出數據之後,沒有空格,而是換行符。

樣例輸入

16
12 34 34 25 25 25 25 11 15 17 28 14 22 22 22 13

樣例輸出

-1 12 2 34 4 25 -5 11 15 17 28 14 3 22 -1 13
#include<iostream>
#include
<cstring> #include<cstdio> using namespace std; const int N = 10000 + 5; int cnt[N], a[N], n; void Solve_question(){ memset(cnt, 0, sizeof(cnt)); a[0] = -1; int cur = 0, x; for(int i = 1; i <= n; i++){ scanf("%d", &x); if(x != a[cur]){ a[++cur] = x; cnt[cur] = 1; }else{ cnt[cur]++; } } x = 1; for(int i = cur; i >= 1; i--){ if(cnt[i] == 1 && cnt[i-1] != 1){ cnt[i] = -x; x = 1; }else if(cnt[i] == 1 && cnt[i-1] == 1){ x++; cnt[i] = 0; } } x = 0; for(int i = 1; i <= cur; i++){ if(cnt[i]) printf("%d ", cnt[i]); printf("%d%c", a[i], i==cur?\n: ); } } int main(){ while(scanf("%d", &n) == 1){ Solve_question(); } return 0; }

 

HNUSTOJ-1520 壓縮編碼