首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

【培训考题】合唱队形

2012-11-03 
【培训试题】合唱队形【培训试题】合唱队形Time Limit:1000MSMemory Limit:65536KTotal Submit:1335 Accepted:

【培训试题】合唱队形
【培训试题】合唱队形


Time Limit:1000MS  Memory Limit:65536K
Total Submit:1335 Accepted:650
Case Time Limit:500MS

Description

N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,  则他们的身高满足存在i(1<=i<=K)使得Ti<T2<......<Ti-1<Ti>Ti+1>......>TK。
    你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

Input

输入的第一行是一个整数N(2<=N<=100),表示同学的总数。第二行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。

Output

输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

Sample Input

8
186 186 150 200 160 130 197 220

Sample Output

4

Hint

数据规模
对于50%的数据,保证有n<=20;
对于全部的数据,保证有n<=100。

#include <stdio.h>#define MAXNUM 200int main(){int a[MAXNUM], b[MAXNUM], c[MAXNUM];int n, max, i, j;scanf("%d", &n);if(n < 2 || n > 200)return 0;//查找此序列中的最长升序列for(i = 0; i < n; i++){scanf("%d", &a[i]);}b[0] = 1;for(i = 1; i < n; i++){max = 0;for(j = i - 1; j >= 0; j--){if(a[j] < a[i] && max < b[j] + 1){max = b[j];}}b[i] = max + 1;}//降序列c[n - 1] = 1;for(i = n - 1; i >= 0; i--){max = 0;for(j = i + 1; j < n; j++){if(a[j] < a[i] && max < c[j] + 1){max = c[j];}}c[i] = max + 1;}max = b[0] + c[0];for(i = 0; i < n; i++){if(max < b[i] + c[i]){max = b[i] + c[i];}}//+1的原因是两次包含了中间那个数printf("%d\n", n - max + 1);return 0;}

热点排行