当前位置:首页 > 题解目录 > 正文内容

【题解】合唱队形

亿万年的星光3年前 (2023-06-02)题解目录2022

【题目描写】

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


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

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


【输入描述】

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

【输出描述】

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

【样例输入】

8
186 186 150 200 160 130 197 220

【样例输出】

4

【题目分析】


【参考答案】

#include<bits/stdc++.h>
using namespace std;
int n,a[110],f[110][2],MAX;//f[i][1]表示上升子序列的个数,f[i][2]表示下降子序列的个数
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		int mx=0;
		for(int j=1;j<i;j++)
		{
			if(a[j]<a[i])
			{
				mx=max(mx,f[j][1]);//求上升子序列的最大值,也就是第一部分可以留下的最大人数
			}
		}
		f[i][1]=mx+1;
	}
	for(int i=n;i>=1;i--)
	{
		int mx=0;
		for(int j=n;j>i;j--)
		{
			if(a[j]<a[i])
			{
				mx=max(mx,f[j][2]);
			}
		}
		f[i][2]=mx+1;
		MAX=max(MAX,f[i][1]+f[i][2]-1);//f[i][1]+f[i][2]-1表示当a[i]最高点时留下的人数,这里减一,因为上升和下降的个数都包括了最高点,所以减去一个
	}
	cout<<n-MAX<<endl;
	return 0;
 }


    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    分享给朋友:

    相关文章

    【题解】均分蛋糕

    【题解】均分蛋糕

    【题目描述】小明的生日要到了!根据习俗,他需要将一些派分给大家。他有 N 个不同口味、不同大小的派。有 F 个朋友会来参加我的派对,每个人会拿到一块派(必须一个...

    【题解】变换数组

    【题目描述】输入一个数组 a,包含有 n 个元素 a1,a2,⋯,an。对这个数组进行 m 次变换,每次变换会将数组 a ...

    植树节

    【题目描述】植树节快要到了,学校要组织志愿者去给树苗浇水。有一排树苗,编号依次是 0,1,2, . . . 。现有 n个志愿者去给树苗浇水,第 i 个志愿者选定了一个区间[ai, bi],表示第 i个...

    【题解】循环比赛日程表

    【题目描述】设有N个选手进行循环比赛,其中 N=2^M ,要求每名选手要与其他的N-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行N-1天,要求每天没有选手轮空。【输入描述】输入M【输出描述】一...

    【题解】采摘花生2

    【题目描述】Hello Kitty又一次来到花生地里摘花生,从左上角进入花生地,从右下角出去,只能向右或者向下,请问Hello Kitty应该沿着什么样的路线走,能够摘到的花生数量最多(假设花生地里没...

    【题解】二分法查找左边界

    参考代码:# include <bits/stdc++.h> using namespace std; int a[100005];&...