• 题目1131:合唱队形


    题目描述:

    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
    ",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 ****************************************************************/
  • 相关阅读:
    《操作系统真象还原》bochs安装
    容量限制的设施位置问题
    Python1 关于安装
    分层测试
    理解 Apache与Tomcat
    CSPS Day1 T1 格雷码
    快速幂+龟速乘+费马小定理+逆元+矩阵乘法
    P2261 [CQOI2007]余数求和
    MySQL源码:Innobase字典管理及索引
    一致代码段和非一致代码段
  • 原文地址:https://www.cnblogs.com/qq1029579233/p/4508015.html
Copyright © 2020-2023  润新知