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);
        }
    }
    
  • 相关阅读:
    IO 单个文件的多线程拷贝
    day30 进程 同步 异步 阻塞 非阻塞 并发 并行 创建进程 守护进程 僵尸进程与孤儿进程 互斥锁
    day31 进程间通讯,线程
    d29天 上传电影练习 UDP使用 ScketServer模块
    d28 scoket套接字 struct模块
    d27网络编程
    d24 反射,元类
    d23 多态,oop中常用的内置函数 类中常用内置函数
    d22 封装 property装饰器 接口 抽象类 鸭子类型
    d21天 继承
  • 原文地址:https://www.cnblogs.com/hurentian/p/14336479.html
Copyright © 2011-2022 走看看