码迷,mamicode.com
首页 > 其他好文 > 详细

题目1131:合唱队形

时间:2015-05-16 17:54:18      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

题目描述:

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

输出:

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

样例输入:
8
186 186 150 200 160 130 197 220
样例输出:
4

 

import java.util.Scanner;
 
 
public class Main{
    public static void main(String[]args){
    Scanner in=new Scanner(System.in);
    while(in.hasNext()){
        int N=in.nextInt();
        int[]val=new int[N];
        for(int i=0;i<N;i++){
        val[i]=in.nextInt();
        }
        int[]F1=new int[N];
        int[]F2=new int[N];
        F1[0]=1;
        for(int i=1;i<N;i++){
        int max=1;
        for(int j=0;j<i;j++){
            if(val[i]>val[j]&&F1[j]+1>max){
            max=F1[j]+1;
            }
        }
        F1[i]=max;
        }
        F2[N-1]=1;
        for(int i=N-2;i>=0;i--){
        int max=1;
        for(int j=N-1;j>i;j--){
            if(val[i]>val[j]&&F2[j]+1>max){
            max=F2[j]+1;
            }
        }
        F2[i]=max;
        }
        int max=1;
        for(int i=0;i<N;i++){
        max=Math.max(max,F1[i]+F2[i]-1);
        }
 
        System.out.println(N-max);
    }
    }
 }
 
/**************************************************************
    Problem: 1131
    User: 0000H
    Language: Java
    Result: Time Limit Exceed

 

 1     #include<iostream>
 2     #include<stdio.h>
 3     #include<stdlib.h>
 4     using namespace std;
 5     int main()
 6     {
 7         int n;
 8         while(scanf("%d",&n)!=EOF)
 9         {
10             int * s;
11             s=new int[n+1];
12             for(int i=1;i<=n;i++)
13                 scanf("%d",&s[i]);
14             int * r;
15             r=new int[n+1];
16             for(int i=1;i<=n;i++)
17             {
18                 int max=1;
19                 for(int j=1;j<i;j++)
20                     if(s[j]<s[i]&&r[j]+1>max)
21                         max=r[j]+1;
22                 r[i]=max;
23             }
24             int * l;
25             l=new int[n+1];
26             for(int i=n;i>=0;i--)
27             {
28                 int max=1;
29                 for(int j=n;j>i;j--)
30                     if(s[j]<s[i]&&l[j]+1>max)
31                         max=l[j]+1;
32                 l[i]=max;
33             }
34             int min=n;
35             for(int i=1;i<=n;i++)
36                 if(min>(n-l[i]-r[i]+1))
37                     min=n-l[i]-r[i]+1;
38             printf("%d\n",min);
39         }
40         return 0;
41     }
42 /**************************************************************
43     Problem: 1131
44     User: 0000H
45     Language: C++
46     Result: Accepted
47     Time:730 ms
48     Memory:7988 kb
49 ****************************************************************/

 

题目1131:合唱队形

标签:

原文地址:http://www.cnblogs.com/qq1029579233/p/4508015.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!