zoukankan      html  css  js  c++  java
  • 2021寒假每日一题《合唱队形》

    合唱队形

    题目来源:NOIP2004提高组
    时间限制:(1000ms) 内存限制:(128mb)

    题目描述

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

    输入格式

    输入的第一行是一个整数 (N) ,表示同学的总数。
    第二行有 (N) 个整数,用空格分隔,第 (i) 个整数 (T_i) 是第 (i) 位同学的身高(厘米)。

    输出格式

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

    数据范围

    (2 ≤N ≤ 100) ,
    (130 ≤ T_i ≤ 230)

    样例输入

    8
    186 186 150 200 160 130 197 220
    

    样例输出

    4
    

    解题思路

    要使所有同学的身高呈现出先递增后递减的格式,需要将中间比较 突出 的同学请出列。
    先设置一个中间点,中间点将左右两边分开,只需要使左右两边分别剔除的同学最少,再将左右两边相加即可。
    由于分成了左右两边,于是只需要计算左边的最长递增子序列,右边反过来的最长递增子序列,然后把它们加起来就得到了需要的同学的数量。
    然后用总数减去需要的同学的数量就得到了需要剔除的同学的数量。

    解题代码

    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            int n = input.nextInt();
            int[] t = new int[n];
            for (int i = 0; i < n; i++) {
                t[i] = input.nextInt();
            }
            input.close();
    
            int[] f = new int[n], g = new int[n];
    
            for (int i = 0; i < n; i++) {
                f[i] = 1;
                for (int j = 0; j < i; j++) {
                    if (t[j] < t[i]) {
                        f[i] = Math.max(f[i], f[j] + 1);
                    }
                }
            }
    
            for (int i = n - 1; i >= 0; i--) {
                g[i] = 1;
                for (int j = n - 1; j >= i; j--) {
                    if (t[j] < t[i]) {
                        g[i] = Math.max(g[i], g[j] + 1);
                    }
                }
            }
    
            int ans = 0;
            for (int k = 0; k < n; k++) {
                ans = Math.max(ans, f[k] + g[k] - 1);
            }
    
            System.out.println(n - ans);
        }
    }
    
  • 相关阅读:
    公用表表达式(CTE)的递归调用
    c# 如何让tooltip显示文字换行
    实战 SQL Server 2008 数据库误删除数据的恢复
    SQL SERVER数据库中 是否可以对视图进行修改删除
    asp.net中实现文件批量上传
    sql server 2008学习2 文件和文件组
    sql server 2008学习3 表组织和索引组织
    sql server 2008学习4 设计索引的建议
    sql server 2008学习10 存储过程
    .net 调用 sql server 自定义函数,并输出返回值
  • 原文地址:https://www.cnblogs.com/hurentian/p/14336479.html
Copyright © 2011-2022 走看看