九度oj 1131

来源:互联网 发布:澳洲gpa算法 编辑:程序博客网 时间:2024/05/21 10:44
题目描述:

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位同学的身高(厘米)。

输出:

可能包括多组测试数据,对于每组数据,
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

样例输入:
8186 186 150 200 160 130 197 220
样例输出:
4
来源:

2008年北京大学方正实验室计算机研究生机试真题

#include<stdio.h>int a[101];int b[101];int c[101];int max(int x,int y){    return (x>y)?x:y;}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {                 for(int i=1;i<=n;i++)                 {                         scanf("%d",&a[i]);                         }                         for(int i=1;i<=n;i++)                         {                                 int tmax=1;                                 for(int j=1;j<i;j++)                                 {                                         if(a[j]<a[i])                                         {                                                      tmax=max(tmax,b[j]+1);                                                      }                                                      }                                                      b[i]=tmax;                                                      }                                                       for(int i=n;i>=1;i--)                                                      {                                                                 int cmax=1;                                                                       for(int j=n;j>i;j--)                                                                       {                                                                                                                                                              if(a[i]>a[j])                                                                               {                                                                                            cmax=max(cmax,c[j]+1);                                                                                            }                                                                                            }                                                                                            c[i]=cmax;                                                                                            }                                                                                            int ans=1;                                                                                            for(int i=1;i<=n;i++)                                                                                            {                                                                                                    ans=max(ans,b[i]+c[i]);                                                                                                    }                                                                                                    ans--;                                                                                                    ans=n-ans;                                                                                                    printf("%d\n",ans);                                                                                                    }                                                                                                    }


0 0