描述 |
|
---|---|
知识点 | 循环 |
运行时间限制 | 0M |
内存限制 | 0 |
输入 | 整数N 一行整数,空格隔开,N位同学身高
|
输出 | 最少需要几位同学出列 |
样例输入 | 8186 186 150 200 160 130 197 200 |
样例输出 | 4 |
编程思路是:需要三个数组,第一个数组存放原数据。第二个数组用于存放人数:从左向右遍历时,对于当前的数据(身高),寻找符合条件的人数,要求是从小到大排列的最大数。第三个数组用于存放人数:从右向左遍历,对于当前的数据,寻找符合条件的人数,要求从大到小排列的最大数。最后,通过第二个数组和第三个数组对应位置的数据之和,再减去1,来求得最佳解。
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
int main()
{
vector<int> input;
int n=0;
cin>>n;
for(int i=0;i<n;i++)
{
int tmp=0;
cin>>tmp;
input.push_back(tmp);
}
vector<int> leftSide(n,1);
vector<int> rightSide(n,1);
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(input[i]>input[j]&&leftSide[i]<leftSide[j]+1)
leftSide[i]=leftSide[j]+1;
}
}
for(int i=n-1;i>=0;i--)
{
for(int j=i+1;j<n;j++)
{
if(input[i]>input[j]&&rightSide[i]<rightSide[j]+1)
rightSide[i]=rightSide[j]+1;
}
}
int res=0;
for(int i=0;i<n;i++)
{
if(leftSide[i]+rightSide[i]-1>res)
res=leftSide[i]+rightSide[i]-1;
}
res=n-res;
cout<<res<<endl;
getchar();
return 0;
}