题目描述
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<…Ti+1>…>TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入输出格式
输入格式:
输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
输出格式:
输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
输入输出样例
输入样例#1:
8
186 186 150 200 160 130 197 220
输出样例#1:
4
说明
对于50%的数据,保证有n<=20;
对于全部的数据,保证有n<=100。
分析
正反做一遍最长不下降,正确性显然
nlogn 求最长不下降子序列
我们设d[i]表示长度为i的最长不下降子序列最尾元素的最小值,显然d[i]<=d[i+1],d数组符合单调性。因此对于a[i]只需在d数组中二分即可
lower_bound && upper_bound
lower_bound(a+l,a+r+1,key)表示在a数组的l~r范围进行二份查找(注意你需要保证这个

本文介绍了一道编程题,要求在给定的一排学生中,找到最少需要多少名学生离开,以便剩余的学生能组成合唱队形,即身高满足不升不降的条件。解决方案是通过计算最长不下降子序列,并使用二分查找优化算法,降低时间复杂度至nlogn。文章提供了样例输入输出和代码实现。

2349

被折叠的 条评论
为什么被折叠?



