计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1<=i<=K)使得:
T1 < T2 <… Ti>Ti+1>…>TK
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
C++代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
int minStudentOut(vector<int> height){
int size =height.size(),ret=INT_MAX;
vector<int> leftSmall, rightSmall;
leftSmall = leftSmallTotal(height);
rightSmall = rightSmallTotal(height);
for (int i = 0; i < size; i++){
ret = min(ret, i-leftSmall[i] + size-(i+1)- rightSmall[i]);
}
return ret;
}
vector<int> leftSmallTotal(vector<int> height){
int size = height.size(),smallTol=0;
vector<int> ret(size, 0);
for (int i = 0; i < size; i++){
int num = height[i];
for (int j = 0; j < i; j++){
if (num>height[j]){
smallTol = max(smallTol, ret[j]+1);
}
}
ret[i] = smallTol;
smallTol = 0;
}
return ret;
}
vector<int> rightSmallTotal(vector<int> height){
int size = height.size(), smallTol = 0;
vector<int> ret(size, 0);
for (int i = size-1; i >=0 ; i--){
int num = height[i];
for (int j = size-1; j >i; j--){
if (num>height[j]){
smallTol = max(smallTol, ret[j] + 1);
}
}
ret[i] = smallTol;
smallTol = 0;
}
return ret;
}
};
int main(){
Solution so;
int num;
vector<int> vec;
cin >> num;
vector<int> height;
height.resize(num);
for (int i = 0; i < num;i++)
cin>>height[i];
cout << so.minStudentOut(height);
system("pause");
return 0;
}