1264:【例9.8】合唱队形
2711:合唱队形
【问题描述】
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,
使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:
设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,
则他们的身高满足T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1≤i≤K)。
你的任务是,已知所有N位同学的身高,
计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
【输入文件】
输入文件chorus.in的第一行是一个整数N(2 ≤ N ≤ 100),
表示同学的总数。第二行有n个整数,用空格分隔,
第i个整数Ti(130 ≤ Ti ≤ 230)是第i位同学的身高(厘米)。
【输出文件】
输出文件chorus.out包括一行,
这一行只包含一个整数,就是最少需要几位同学出列。
【样例输入】
8
186 186 150 200 160 130 197 220
【样例输出】
4
【例8】合唱队形(《信息学奥赛一本通第五版》)
https://www.cnblogs.com/Benjamin-cpp/p/10816367.html
https://www.cnblogs.com/EdSheeran/p/7629975.html
合唱队形(简单的动规)_合唱队列的编法_wspl654321的博客-CSDN博客
合唱队形(信息学奥赛一本通-T1264)_合唱队形 一本通_Alex_McAvoy的博客-CSDN博客
【动态规划】合唱队形_)NCuyALnA$Ke的博客-CSDN博客
https://blog.csdn.net/sdauguanweihong/article/details/86247847
C++参考代码:
#include<cstring>
#include<iostream>
using namespace std;
int a[200],b[200],c[200];
main()
{
int n,i,j,maxx;
//读学生数
cin>>n;
//身高满足递增顺序的两个队列初始化
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
//读每个学生的身高
for (i=1;i<=n;i++)
cin>>a[i];
//按照由左而右的顺序计算b序列
//最长的上升序列
for (i=1;i<=n;i++)
{
b[i]=1;
for (j=1;j<=i-1;j++)
if ( (a[i]>a[j]) && (b[j]+1>b[i]) )
b[i]=b[j]+1;
}
//按照由右而左的顺序计算c序列
for (i=n;i>=1;i--)
{
c[i]=1;
for (j=i+1;j<=n;j++)
if ((a[i]>a[j])&&(c[j]+1>c[i]))
c[i]=c[j]+1;
}
//计算合唱队的人数max(其中1人被重复计算)
maxx=0;
for (i=1;i<=n;i++)
if ( b[i]+c[i] > maxx )
maxx=b[i]+c[i];
//输出出列人数
cout<<n-(maxx-1)<<endl;
return 0;
}
/*
这个算法的时间复杂度为O(n^2),
在1秒时限内可解决n≤100范围内的问题。
*/
电子学会青少年编程等级考试
中国电子学会考评中心
软件编程(C语言)
版权声明:本文为dllglvzhenfeng原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。