中北大學NUC2017新生賽1006/NOJ-1986
阿新 • • 發佈:2019-01-05
題目:
練武奇才
時間限制: 1000ms 記憶體限制: 65535KB
通過次數: 0 總提交次數: 0
問題描述很久很久以前,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; }