当前位置:网站首页>ACM. HJ24 合唱队 ●●
ACM. HJ24 合唱队 ●●
2022-06-22 19:56:00 【chenyfan_】
HJ24 合唱队 ●●
描述
N 位同学站成一排,音乐老师要请最少的同学出列,使得剩下的 K 位同学排成合唱队形。
设K位同学从左到右依次编号为 1,2…,K ,他们的身高分别为 T k T_k Tk,能找到一个同学,他的两边的同学身高都依次严格降低的队形就是合唱队形。
例子:
123 124 125 123 121 是一个合唱队形
123 123 124 122不是合唱队形,因为前两名同学身高相等,不符合要求
123 122 121 122不是合唱队形,因为找不到一个同学,他的两侧同学身高递减。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
注意:不允许改变队列元素的先后顺序 且 不要求最高同学左右人数必须相等
数据范围: 1 ≤ n ≤ 3000 1 \le n \le 3000 1≤n≤3000
输入描述:
用例两行数据,第一行是同学的总数 N ,第二行是 N 位同学的身高,以空格隔开
输出描述:
最少需要几位同学出列
示例
输入:
8
186 186 150 200 160 130 197 200
输出:
4
说明:
由于不允许改变队列元素的先后顺序,所以最终剩下的队列应该为186 200 160 130或150 200 160 130
题解
1. 动态规划(最长递增子序列)
为了得到最少的出列人数,那么我们可以计算出当以某个身高为中点时,他左右两边符合条件的最大人数和,总人数减去合唱队列人数即为最终结果。
因此,我们可以用两个数组 left、right,记录某个身高为终点、起点时的最长递增 / 递减子序列和。
如此,便可以将问题转化为与300. 最长递增子序列 ●●类似的情况。
- 时间复杂度: O ( n 2 ) O(n^2) O(n2),需要多次遍历数组,两层for循环嵌套。
- 空间复杂度: O ( n ) O(n) O(n),存每个位置的dp递增和递减数组。
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> statures(n, 0);
for(int i = 0; i < n; ++i){
cin >> statures[i];
}
vector<int> left(n, 0);
vector<int> right(n, 0);
for(int i = 0; i < n; ++i){
for(int j = i-1; j >= 0; --j){
if(statures[i] > statures[j]){
left[i] = max(left[i], left[j] + 1); // staturs[i]前的最长递增子序列
}
}
}
for(int i = n-1; i >= 0; --i){
for(int j = i+1; j < n; ++j){
if(statures[i] > statures[j]){
right[i] = max(right[i], right[j] + 1); // staturs[i]后的最长递减子序列
}
}
}
int ans = 0;
for(int i = 0; i < n; ++i){
// 计算比较结果
ans = max(ans, (left[i]+right[i]+1) * (left[i]>0 && right[i]>0));
}
cout << n-ans;
return 0;
}
2. 动态规划 + 二分法
利用一个动态数组记录当前的序列,并用二分法进行插入排序,来得到最长子序列的长度,具体见300. 最长递增子序列 ●●
- 时间复杂度: O ( n l o g 2 ( n ) ) O(nlog_2(n)) O(nlog2(n)),借助二分。
- 空间复杂度: O ( n ) O(n) O(n),一个存左右子序列值的数组。
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> statures(n, 0);
for(int i = 0; i < n; ++i){
cin >> statures[i];
}
vector<int> left(n, 1); // left表示staturs[i]结尾的最长递增子序列长度
vector<int> dpl;
dpl.emplace_back(statures[0]); // 动态规划数组
for(int i = 1; i < n; ++i){
if(statures[i] > dpl[dpl.size()-1]){
dpl.emplace_back(statures[i]);
left[i] = dpl.size();
continue;
}
int l = 0, r = dpl.size()-1;
while(l <= r){
int mid = (l+r) >> 1;
if(dpl[mid] >= statures[i]){
r = mid - 1;
}else{
l = mid + 1;
}
}
dpl[l] = statures[i]; // 替换位置
left[i] = l + 1; // 这里要更新staturs[i]对应的子序列长度,即l+1
}
vector<int> right(n, 1); // right表示staturs[i]开头的最长递减子序列长度
vector<int> dpr;
dpr.emplace_back(statures[n-1]); // 动态规划数组
for(int i = n-2; i >= 0; --i){
if(statures[i] > dpr[dpr.size()-1]){
dpr.emplace_back(statures[i]);
right[i] = dpr.size();
continue;
}
int l = 0, r = dpr.size()-1;
while(l <= r){
int mid = (l+r) >> 1;
if(dpr[mid] >= statures[i]){
r = mid - 1;
}else{
l = mid + 1;
}
}
dpr[l] = statures[i];
right[i] = l + 1; // 这里要更新staturs[i]对应的子序列长度,即l+1
}
int ans = 0;
for(int i = 0; i < n; ++i){
// 所有身高为中点时的队列长度和
ans = max(ans, (left[i]+right[i]-1) * (left[i]>0 && right[i]>0));
}
cout << n-ans; // 出列人数
return 0;
}
边栏推荐
- ≥server2012R2系统,禁用系统自带的部分计划任务
- 2022年A特种设备相关管理(电梯)考题及模拟考试
- 513. find the value in the lower left corner of the tree / Sword finger offer II 091 Paint the house
- laravel+宝塔计划任务
- 【剑指Offer】面试题44.数字序列中的某一位数字
- pytorch的模型保存加载和继续训练
- Apple corefoundation source code
- Golang learning notes - structure
- MySQL adds (appends) prefix and suffix to a column field
- 2022 chemical automation control instrument examination exercises and online simulation examination
猜你喜欢
![[redis]Redis6的事务操作](/img/50/639867a2fcb92082ea262a8a19bb68.png)
[redis]Redis6的事务操作

Adblock屏蔽百度热搜

优化求解器 | Gurobi的MVar类:矩阵建模利器、求解对偶问题的备选方案 (附详细案例+代码)

字节跳动提出轻量级高效新型网络MoCoViT,在分类、检测等CV任务上性能优于GhostNet、MobileNetV3!...
![[records of different objects required by QIPA]](/img/f7/c0f0f56e4f1bf4f1a0a61552afcd2b.png)
[records of different objects required by QIPA]

R language usarrests dataset visualization

Redis learning notes
![[redis] cluster and common errors](/img/a5/94906b62b1ec0d549f9b72ff3db7f2.png)
[redis] cluster and common errors

2022年起重机械指挥考试模拟100题及模拟考试

Set up your own website (12)
随机推荐
71- analysis of an Oracle DBA interview with Alibaba in 2010
[redis]发布与订阅
PlainSelect.getGroupBy()Lnet/sf/jsqlparser/statement/select/GroupByElement;
MySQL adds (appends) prefix and suffix to a column field
【文末送书】火遍全网的AI给老照片上色,这里有一份详细教程!
Golang學習筆記—結構體
2022 chemical automation control instrument examination exercises and online simulation examination
[redis] cluster and common errors
How to calculate the Gini coefficient in R (with examples)
72 results and development suggestions of the latest on-site production system optimization
百家讲坛 雍正十三年(下部)
查看苹果产品保修状态
Easyclick update Gallery
2022 question bank and simulated examination for work license of main principals of hazardous chemical business units
74- how to remedy the loss of Oracle to MySQL for this kind of SQL optimization?
一行代码为特定状态绑定SwiftUI视图动画
Is the brokerage account of qiniu delivery safe? Is the brokerage account provided by qiniu true?
扩展Ribbon支持Nacos权重的三种方式
【链表中倒数第k个结点】
Objective-C不同数据类型占用字节大小