题目描述
n 位同学站成一排,音乐老师要请其中的 n−k 位同学出列,使得剩下的 k 位同学排成合唱队形。
合唱队形是指这样的一种队形:设 k 位同学从左到右依次编号为 1,2, … ,k,他们的身高分别为 t1,t2, … ,tk,则他们的身高满足 t1<⋯<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
说明/提示
对于 50% 的数据,保证有 n≤20。
对于全部的数据,保证有 n≤100。
代码
无注释版
#include<bits/stdc++.h>
using namespace std;
int a[110][2];
int b[110];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>b[i];
}
for(int i=1;i<=n;i++){
a[i][0]=1;
for(int j=1;j<i;j++){
if(b[i]>b[j]){
a[i][0]=max(a[i][0],a[j][0]+1);
}
}
}
for(int i=1;i<=n;i++){
a[i][1]=1;
for(int j=1;j<i;j++){
if(b[i]<b[j]){
a[i][1]=max(a[i][1],max(a[j][0],a[j][1])+1);
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,max(a[i][0],a[i][1]));
}
cout<<n-ans<<"\n";
}
有注释版
#include<bits/stdc++.h> // 引入标准库,包含常用的C++库
using namespace std; // 使用标准命名空间
int a[110][2]; // a[i][0]表示第i个学生形成上升序列的最大长度,a[i][1]表示第i个学生形成下降序列的最大长度
int b[110]; // b[i]表示第i个学生的身高
int main() {
ios::sync_with_stdio(0); // 加速输入输出
cin.tie(0); // 解绑cin和cout,提升效率
cout.tie(0); // 解绑cin和cout,提升效率
int n; // 学生的总人数
cin >> n; // 输入学生的数量
for (int i = 1; i <= n; i++) { // 输入每个学生的身高
cin >> b[i];
}
// 计算每个学生的上升序列最大长度
for (int i = 1; i <= n; i++) { // 遍历每个学生
a[i][0] = 1; // 默认当前学生自己可以单独形成一个长度为1的上升序列
for (int j = 1; j < i; j++) { // 检查在当前学生之前的所有学生
if (b[i] > b[j]) { // 如果当前学生的身高大于前一个学生的身高
a[i][0] = max(a[i][0], a[j][0] + 1); // 更新a[i][0]为前一个学生的上升序列长度+1
}
}
}
// 计算每个学生的下降序列最大长度
for (int i = 1; i <= n; i++) { // 遍历每个学生
a[i][1] = 1; // 默认当前学生自己可以单独形成一个长度为1的下降序列
for (int j = 1; j < i; j++) { // 检查在当前学生之前的所有学生
if (b[i] < b[j]) { // 如果当前学生的身高小于前一个学生的身高
a[i][1] = max(a[i][1], max(a[j][0], a[j][1]) + 1); // 更新a[i][1]为前一个学生的上升序列或下降序列的最大值+1
}
}
}
int ans = 0; // 初始化结果变量,用于存储最大合唱队形的学生数
for (int i = 1; i <= n; i++) { // 遍历每个学生
ans = max(ans, max(a[i][0], a[i][1])); // 找到每个学生的最大上升序列长度和最大下降序列长度,取最大值
}
cout << n - ans << "\n"; // 输出需要剔除的学生数,即总学生数减去合唱队形的最大长度
}