合唱队形

来源:互联网 发布:win32 api编程入门pdf 编辑:程序博客网 时间:2024/04/29 23:48

合唱队形

(chorus.pas/c/cpp)

来源:NOIP2004(提高组) 第一题

     N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
    合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,  则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。
    你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
【输入文件】
    输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
【输出文件】
    输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
【样例输入】
8
186 186 150 200 160 130 197 220
【样例输出】
4
【数据规模】
对于50%的数据,保证有n<=20;
对于全部的数据,保证有n<=100。

==================================

其实是最长不下降序列和上升序列

=================================

{ID:jie19952PROG:LANG:PASCAL}var  n:longint;  a:array[1..100]of longint;  f_up,f_down:array[0..101]of longint;procedure init;begin  assign(input,'chorus.in');  assign(output,'chorus.out');  reset(input); rewrite(output);end;procedure terminate;begin  close(input); close(output);  halt;end;procedure main;var  i,j:longint;  ans:longint;begin  readln(n);  for i:=1 to n do    begin      read(a[i]);      f_up[i]:=1;      f_down[i]:=1;    end;  f_up[0]:=0; f_up[n+1]:=0;  f_down[0]:=0; f_down[n+1]:=0;    for i:=1 to n do    begin      for j:=i-1 downto 1 do        if (a[i]>a[j]) and (f_up[i]<f_up[j]+1) then          begin            f_up[i]:=f_up[j]+1;          end;    end;  for i:=n downto 1 do    begin      for j:=i+1 to n do        if (a[i]>a[j]) and (f_down[i]<f_down[j]+1) then          begin            f_down[i]:=f_down[j]+1;          end;    end;  ans:=0;  for i:=1 to n do    begin      if ans<f_up[i]+f_down[i]-1 then        ans:=f_up[i]+f_down[i]-1;    end;  writeln(n-ans);end;begin  init;  main;  terminate;end.