合唱隊形(s/dpr/c/cpp)【問題描述】N位同學站成一排,音樂老師要請其中的(N-K)位同學出列,使得剩下的K位同學排成合唱隊形。合唱隊形是指這樣的一種隊形:設K位同學從左到右依次編號為1,2,…,K,他們的身高分別為T1,T2,…,TK,則他們的身高滿足T1<T2<…<Ti,Ti>Ti+1>…>TK(1<=i<=K)。你的任務是,已知所有N位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形?!据斎胛募枯斎胛募牡谝恍惺且粋€整數N(2<=N<=100),表示同學的總數。第一行有n個整數,用空格分隔,第i個整數Ti(130<=Ti<=230)是第i位同學的身高(厘米)?!据敵鑫募枯敵鑫募horus.out包括一行,這一行只包含一個整數,就是最少需要幾位同學出列?!緲永斎搿?1 【樣例輸出】4【數據規?!繉τ?0%的數據,保證有n<=20;對于全部的數據,保證有n<= 100希望大蝦能給出用 TURBO C 的解或者哪位大蝦可以幫忙把一下c++語句翻譯成 TURBO C 的小弟感激不盡,多謝了#include <iostream>#include <fstream>#include <algorithm>#include <cassert>using namespace std;ifstream fin(\" \");ofstream fout(\"chorus.out\");#define cin fin#define cout foutint a[100],b[100];int n;void solve(int* a,int* save){ a[0]=1; int i,j; for(i=1;i<n;i++){ a[i]=1; for(j=0;j<n;j++){ if(save[j]<save[i]&&a[i]<a[j]+1) a[i]=a[j]+1; } }}int main(){ int save[100]; int i,j; cin>>n; assert(2<=n&&n<=100); for(i=0;i<n;i++){ cin>>save[i]; assert(130<=save[i]&&save[i]<=230); } solve(a,save); std::reverse(save,save+n); solve(b,save); int max=-1; for(i=0;i<n;i++){ if(a[i]+b[n-1-i]-1>max)max=a[i]+b[n-1-i]-1; } cout<<n-max<<\'\\n\'; assert(!(cin>>n)); return 0;}
熱心網友
下面的代碼在TC中測試通過#include int a[100],b[100], n;void solve(int* a,int* save){int i, j;a[0]=1;for(i=1;i 100) exit(1);for(i=0;i save[i] || save[i] 230) exit(2);}solve(a,save);for (i = 0; i max) max=a[i]+b[n-1-i]-1;fprintf(fout, \"%d\\n\", n - max);fclose(fin);fclose(fout);}