1. 程式人生 > >中北大學NUC2017新生賽1006/NOJ-1986

中北大學NUC2017新生賽1006/NOJ-1986

題目:

練武奇才

時間限制: 1000ms 記憶體限制: 65535KB

通過次數: 0 總提交次數: 0

問題描述

很久很久以前,constbh大神還在上著小學。一天,在放學的路上,他被一位乞丐叫住,這位乞丐對constbh說,我看你骨骼驚奇,是百年一見的練武奇才,這本如來神掌祕籍,收你十塊錢,就傳授給你吧。constbh很高興地用支付寶給這位乞丐轉了十塊錢拿下了這本祕籍。他決定好好潛心研究這本祕籍。只見上面全是密密麻麻的數字,constbh大呼是不是買到盜版了。他終於翻到最後一頁,書上寫著,你要把這些數字進行解碼,才能看懂祕籍。解碼方式為:在當前剩餘數字的情況下,湊出一個最長的嚴格遞增序列並且輸出。如果還有剩餘數字,則另起一行繼續輸出一個最長的嚴格遞增序列,以此類推

。但是這數字密密麻麻的,constbh已經看得暈過去了,他在臨終。。。啊不,臨暈之前把這個任務交給了你,讓你幫忙解決。

輸入描述

第一行輸入一個數字n,代表祕籍裡面有多少個數字(1 <= n <= 5000)
 接下來n個數字代表密碼字典裡面的數字ai(0 <= ai <= 500)

輸出描述

輸出若干行,同一行的兩個數字之間輸出一個空格用於隔開。

樣例輸入
7
5 1 4 2 3 3 1
樣例輸出
1 2 3 4 5
1 3
來源 中北大學2017年程式設計新生賽 提示

樣例中,一開始我們擁有1 1 2 3 3 4 5七個數字,我們可以先湊出1 2 3 4 5這個上升子序列輸出,此時剩下1和3,另起一行輸出1 3即可。

思路:記錄狀態,暴力模擬

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

int main(){
	ios::sync_with_stdio(false);
	int N;
	cin>>N;
	
	int pos;
	int a[5010]; 
	int used[5010];    //記錄陣列a的第i號元素是否被使用過 
	
	for(int i=0;i<N;i++){ 
		cin>>a[i];
	} 
	sort(a,a+N);
	
	memset(used,0,sizeof(used));   
	
	pos=0;				//已經輸出的個數 
	
	while(pos<N){
		printf("%d",a[0]);
		used[0] = 1;
		pos++;
		for(int i=1;i<N;i++){
			if((a[i]>a[i-1]) && (a[i]<=500)){
				printf(" %d",a[i]);
				used[i] = 1;
				pos++;
			}
		}
		printf("\n");
		
		for(int i=0;i<N;i++){
			if(used[i]){
				a[i] = 1<<30;		//若第i個元素被輸出過,則將其值改變為無窮大 
				used[i]=0;
			}
		}
		sort(a,a+N);				
	}	
	return 0;	
}