标签:
描述 |
|
---|---|
知识点 | 循环 |
运行时间限制 | 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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u012501459/article/details/47344845