1. 程式人生 > >藍橋杯 第七屆省賽試題 壓縮變換

藍橋杯 第七屆省賽試題 壓縮變換

壓縮變換

小明最近在研究壓縮演算法。
他知道,壓縮的時候如果能夠使得數值很小,就能通過熵編碼得到較高的壓縮比。
然而,要使數值很小是一個挑戰。

最近,小明需要壓縮一些正整數的序列,這些序列的特點是,後面出現的數字很大可能是剛出現過不久的數字。對於這種特殊的序列,小明準備對序列做一個變換來減小數字的值。

變換的過程如下:
從左到右列舉序列,每列舉到一個數字,如果這個數字沒有出現過,剛將數字變換成它的相反數,如果數字出現過,則看它在原序列中最後的一次出現後面(且在當前數前面)出現了幾種數字,用這個種類數替換原來的數字。

比如,序列(a1, a2, a3, a4, a5)=(1, 2, 2, 1, 2)在變換過程為:
a1: 1未出現過,所以a1變為-1;
a2: 2未出現過,所以a2變為-2;
a3: 2出現過,最後一次為原序列的a2,在a2後、a3前有0種數字,所以a3變為0;
a4: 1出現過,最後一次為原序列的a1,在a1後、a4前有1種數字,所以a4變為1;
a5: 2出現過,最後一次為原序列的a3,在a3後、a5前有1種數字,所以a5變為1。
現在,給出原序列,請問,按這種變換規則變換後的序列是什麼。

輸入格式:
輸入第一行包含一個整數n,表示序列的長度。
第二行包含n個正整數,表示輸入序列。

輸出格式:
輸出一行,包含n個數,表示變換後的序列。

例如,輸入:
5
1 2 2 1 2

程式應該輸出:
-1 -2 0 1 1

再例如,輸入:
12
1 1 2 3 2 3 1 2 2 2 3 1

程式應該輸出:
-1 0 -2 -3 1 1 2 2 0 0 2 2

資料規模與約定
對於30%的資料,n<=1000;
對於50%的資料,n<=30000;
對於100%的資料,1 <=n<=100000,1<=ai<=10^9


資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗 < 3000ms


請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。

所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效程式碼處理。
package com.diqijie.shengsai;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.HashSet;
import java.util.Scanner;

/**
 * @author leibaobao
 * 壓縮變換
 * 解:此題很簡單,我不知道為什麼放最後一題
 * 可能資料大了通過不了吧,不過我看了下程式碼時間複雜度和親測了1000個數據才48ms
 */
public class _10 {
	public static int count = -1;
	public static int [] array;
	public static int []  endArray;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		array = new int [n];
		endArray = new int [n];
		for(int i = 0; i < n; i++)
			array[i] = scan.nextInt();
		long time1 = System.currentTimeMillis();
		for(int i = 0; i < n; i++)
			endArray[i] = fun(i);
		for(int i = 0; i < n; i++)
			System.out.print(endArray[i] + " ");

		long time2 = System.currentTimeMillis();
	}
	private static int fun(int n) {
		// TODO Auto-generated method stub
		int temp = array[n];
		HashSet<Integer> hashset = new HashSet<Integer>();
		for(int i = n-1; i >= 0; i--){
			if(array[i] == temp){
				return hashset.size();
			}
			hashset.add(array[i]);
		}
		return count--;
	}

}