当前位置: 首页 > article >正文

合唱队形问题

更好的阅读体验 合唱队形。

题目:合唱队形

N 位同学站成一排,音乐老师要请其中的 (N−K)位同学出列,使得剩下的 K 位同学排成合唱队形。

合唱队形是指这样的一种队形:设 K 位同学从左到右依次编号为 1,2…,K,他们的身高分别为 T1,T2,…,TK,则他们的身高满足 T1<…Ti+1>…>TK(1≤i≤K)。

你的任务是,已知所有 N 位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

输入格式

输入的第一行是一个整数 N,表示同学的总数。

第二行有 N 个整数,用空格分隔,第 i 个整数 Ti是第 i 位同学的身高(厘米)。

输出格式

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

数据范围

2≤N≤100
130≤Ti≤230

输入样例:
8
186 186 150 200 160 130 197 220
输出样例:
4
解题思路:

​ 要求最少需要几位同学出列,即求合唱队形最多由多少人组成。

​ 这题与 登山同出一辙,都是需要求出以某个人的身高为最高点,该点的最长上升子序列最长和下降子序列,求出来之后,枚举所有人的身高,找出最长上升子序列最长与下降子序列之和的最大值,这个最大值就是我们能组成的合唱队形的最大人数,我们再用总的同学数n - 最大人数,即可以求出需要最少出列同学数。

AC代码:
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;

int n;
int f[N], g[N], a[N];


int main()
{
    cin >> n;
    for (int i = 1; i <= n; i ++) cin >> a[i];

    for (int i = 1; i <= n; i ++)
    {
        f[i] = 1;
        for (int j = 1; j < i; j ++)
            if (a[i] > a[j]) f[i] = max(f[i], f[j] + 1);
    }

    for (int i = n; i; i --)
    {
        g[i] = 1;
        for (int j = n; j > i; j --)
            if (a[i] > a[j]) g[i] = max(g[i], g[j] + 1);
    }

    int res = 0;
    for (int i = 1; i <= n; i ++) res = max(res, f[i] + g[i] - 1);  //中间点求了两次需要减去一次

    cout << n - res <<  endl;

    return 0;
}

http://www.kler.cn/a/160865.html

相关文章:

  • C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
  • AI制作ppt
  • MySQL45讲 第二十讲 幻读是什么,幻读有什么问题?
  • 除了 Postman,还有什么好用的 API 调试工具吗
  • python装饰器的使用以及私有化
  • 【日志】392.判断子序列
  • python数据分析
  • C语言实现植物大战僵尸(完整版)
  • 剑指 Offer(第2版)面试题 19:正则表达式匹配
  • Linux中的日志管理
  • 【智能家居】三、添加语音识别模块的串口读取功能点
  • Java语言中的修饰符
  • 统计centos系统哪一个进程打开文件描述符
  • CSS 在性能优化方面的实践
  • 使用pytorch从零开始实现迷你GPT
  • R语言手册30分钟上手
  • Javase | 贪吃蛇小游戏
  • L1-025:正整数A+B
  • python筛选并删除两个文件夹中不同文件名的文件
  • 2-redis高级-centos上安装redis(编译安装、redis启动)、redis客户端操作、redis使用场景、redis中的通用命令
  • Google Guava 集合工具使用详解
  • Node.js快速搭建简单的HTTP服务器并发布公网远程访问
  • 多向通信----多人聊天
  • Elaticsearch 学习笔记
  • 量子纠缠通讯:未来信息技术的革新者
  • AI算力研究报告:智算供给格局分化国产化进程有望加速