题目描述

计算最少出列多少位同学,使得剩下的同学排成合唱队形

说明:

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

输入描述:

整数N

输出描述:

最少需要几位同学出列
示例1

输入

8
186 186 150 200 160 130 197 200

输出

4

看题目中的要求,必须满足成合唱队的形式,这应该是关于递增数列的题目,要求一个数的左边都递增,右边都递减。这个时候就可以先求出每个数在最大递增子串中的位置,然后逆向求出每个数在最大递增子串中的位置。如下图所示:

设数据的数组为vec[i],存放递增子串的位置为dp[i],逆向递增子串的位置为dq[i],如上图所示进行一系列操作,就可以求出递增递减子串的位置数目。将上述操作用代码表示为:
vector<int> vec(n), dp(n), dq(n);int i, k, j, ma = 0;for (i = 0; i < n; ++i){cin >> vec[i];dp[i] = 1;dq[i] = 1;}for (i = 1; i < n; ++i){for (j = 0; j < i; ++j){if (vec[i] > vec[j])dp[i] = max(dp[i], dp[j] + 1);}}for (i = n - 2; i >= 0; --i){for (j = n - 1; j > i; --j){if (vec[i] > vec[j])dq[i] = max(dq[i], dq[j] + 1);}}
其中都是求最大值。
然后根据递增递减位置数相加得出每个数在的所在队列的人数加1,则可以通过dp[i]+dq[i]-1来求需要剔除的数目。如下所示:
代码实现如下:
 for (i = 0; i < n; ++i)ma = max(ma, dp[i] + dq[i] - 1);
完整代码如下所示;
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <math.h>
using namespace std;int main()
{int n;while (cin >> n){vector<int> vec(n), dp(n), dq(n);int i, k, j, ma = 0;for (i = 0; i < n; ++i){cin >> vec[i];dp[i] = 1;dq[i] = 1;}for (i = 1; i < n; ++i){for (j = 0; j < i; ++j){if (vec[i] > vec[j])dp[i] = max(dp[i], dp[j] + 1);}}for (i = n - 2; i >= 0; --i){for (j = n - 1; j > i; --j){if (vec[i] > vec[j])dq[i] = max(dq[i], dq[j] + 1);}}for (i = 0; i < n; ++i)ma = max(ma, dp[i] + dq[i] - 1);cout << n - ma << endl;}return 0;
}

《华为机试在线训练》之合唱队相关推荐

  1. 牛客网--华为机试在线训练10:字符个数统计

    牛客网–华为机试在线训练10:字符个数统计 题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127).不在范围内的不作统计. 输入描述: 输入N个字符,字符在A ...

  2. 牛客网–华为机试在线训练9:提取不重复的数

    牛客网–华为机试在线训练9:提取不重复的数 题目描述 输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数. 输入描述: 输入一个int型整数 输出描述: 按照从右向左的阅读顺 ...

  3. 牛客网–华为机试在线训练8:合并表记录

    牛客网–华为机试在线训练8:合并表记录 题目描述 数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出. 输入描述: 先输入键值对的个 ...

  4. 牛客网–华为机试在线训练7:取近似值

    牛客网–华为机试在线训练7:取近似值 题目描述 写出一个程序,接受一个正浮点数值,输出该数值的近似整数值.如果小数点后数值大于等于5,向上取整:小于5,则向下取整. 输入描述: 输入一个正浮点数值 输 ...

  5. 牛客网–华为机试在线训练6:质数因子

    牛客网–华为机试在线训练6:质数因子 题目描述 功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 ) 最后一个数后面也要有空格 详细描述: 函数接 ...

  6. 牛客网–华为机试在线训练5:进制转换

    牛客网–华为机试在线训练5:进制转换 题目描述 写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串.(多组同时输入 ) 输入描述: 输入一个十六进制的数值字符串. 输出描述: 输出该 ...

  7. 牛客网–华为机试在线训练4:字符串分隔

    牛客网–华为机试在线训练4:字符串分隔 题目描述 •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组: •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输 ...

  8. 【To Debug】牛客网--华为机试在线训练3:明明的随机数

    牛客网–华为机试在线训练3:明明的随机数 题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字, ...

  9. 牛客网--华为机试在线训练2:计算字符个数

    牛客网–华为机试在线训练2:计算字符个数 题目描述 写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数.不区分大小写. 输入描述: 输入一个有字母 ...

  10. 牛客网--华为机试在线训练1:字符串最后一个单词的长度

    牛客网–华为机试在线训练1:字符串最后一个单词的长度 题目地址: https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da? ...

最新文章

  1. python int str_python int str
  2. 1、Math类的常用方法
  3. dubbo+zookeeper与提供者、消费者之间端口通信问题(No provider available for the service)
  4. python程序格式框架的描述_python 程序语言设计(嵩天)-学习笔记(第二章python 程序实例解析)...
  5. 持续集成:部署发布篇
  6. C#中yield return用法
  7. C++学习之路 | PTA乙级—— 1041 考试座位号 (15 分)(精简)
  8. einops和einsum:直接操作张量的利器
  9. (05)FPGA内部资源
  10. 8004.ros2中添加boost依赖库写法
  11. [转]使用Git Submodule管理子模块
  12. 119. PHP 性能问题(2)
  13. 运维自动化之5 - 基于LVS实现4层负载均衡应用
  14. Log Parser Lizard 日志分析工具
  15. js抓取今日头条文章
  16. 【软件工程】敏捷宣言
  17. mysql系统设计论文_毕业论文管理系统的设计与实现(MyEclipse,MySQL)
  18. windows server 2012 R2登录密码忘了怎么办呢?
  19. 安河桥间奏为什么火_什么样的人会喜欢安和桥的间奏,初见的时,没想过后来会那么喜欢...
  20. study mysql

热门文章

  1. win7 64 系统中打开或关闭windows功能空白
  2. 两个PDF比较标出差异_轻松搞定PDF格式转换
  3. c语言大作业俄罗斯方块,VC++ 6.0 C语言实现俄罗斯方块详细教程
  4. Creo中如何通过参数控制模型颜色
  5. 如何从 Android 手机上的 SD 卡恢复已删除的照片
  6. java护肤品购物系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  7. 当代家庭教育杂志当代家庭教育杂志社当代家庭教育编辑部2022年第31期目录
  8. Java中getter和setter的一些理解
  9. vant Weapp版本没有自带表单校验
  10. C语言 题目 1728: 字符串的查找删除