描述 | |
---|---|
知识点 | 循环 |
运行时间限制 | 0M |
内存限制 | 0 |
输入 | 整数N 一行整数,空格隔开,N位同学身高 |
输出 | 最少需要几位同学出列 |
样例输入 | 8 186 186 150 200 160 130 197 200 |
样例输出 | 4 |
我的思路比较简单,就是递归的遍历考虑每种情况,很显然复杂度是O(N!),实在太高了,虽然结果正确,但是OJ没通过。
#include <iostream>
#include <vector>
#include<string>
#include <stack>
#include<sstream>
#include "标头.h"
#include <algorithm>
#include <set>
#include<math.h>
using namespace std;
int times=0;
int f(vector<int>);
bool alreadyGood(vector<int> );
void printV(vector<int> v){
for(int i=0;i<v.size();i++){
cout<<v[i];
}
cout<<endl;
}
int main(){
int N,cur;
vector<int> v;
cin>>N;
for(int i=0;i<N;i++){
cin>>cur;
v.push_back(cur);
}
//cout<<alreadyGood(v)<<endl;
cout<<f(v)<<endl;
system("pause");
return 0;
}
int f(vector<int> remain){
int L=remain.size();
if(L==1){times++;return L;}//删除剩1个才能满足关系
if(L==2 && remain[0]!=remain[1]){times++;return L;}
if(alreadyGood(remain)){
printV(remain);
return L;}
vector<int> vc;
int best(0),sol;
for(int i=0;i<L;i++){
vc=remain;
vc.erase(vc.begin()+i,vc.begin()+i+1);
sol = f(vc);
if(sol>best)
best=sol;
if(best==L-1)//此时就不用往下找了,因此最优的情况也就是L-1
return best;
}
return best;
}
bool alreadyGood(vector<int> v){
int L=v.size(),loc(-1);
for(int i=0;i<L-1;i++){
if(v[i+1]==v[i])//存在相等的情况,不满足条件
return 0;
else if(v[i+1]<v[i]){//找到第一个拐点,记录下来
loc=i;break;}
}
if(loc==-1)
return 1;
else{
for(int i=loc;i<L-1;i++){
if(v[i+1]>=v[i])
return 0;
}
return 1;
}
}