您的位置:首页 > 其它

合唱队

2015-07-30 20:45 225 查看
计算最少出列多少位同学,使得剩下的同学排成合唱队形


说明:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: