描述 | |
---|---|
知识点 | 循环 |
运行时间限制 | 0M |
内存限制 | 0 |
输入 | 整数N 一行整数,空格隔开,N位同学身高 |
输出 | 最少需要几位同学出列 |
样例输入 | 8 186 186 150 200 160 130 197 200 |
样例输出 | 4 |
题目严谨一点,排队不能交换位置,才对。
解题思路:找到每一个数做为中间节点的,左边最大升序,右边最大降序的数量,两个相加-1就为最大的人数。
排队出列的人数即为n-最大队列人数。
如果思路不对,请多多指教!!
#include <iostream>
using namespace std;
#include <string>
#include <algorithm>
#include <vector>
#define MaxNumber 128
int main()
{
int n;
int a[MaxNumber];
int f1[MaxNumber];//存放合唱队的人数(左至右)
int f2[MaxNumber];//right to left; 人数
cin>>n;
for (int i=1;i<=n;i++) //,1 start
{
cin>>a[i];
}
//求最大升序的数组
for (int i=1;i<=n;i++) //由左向右依次遍历
{
f1[i]=1;//至少一个人符合条件
for (int j=1;j<i;j++)
{
if (a[i]>a[j]&&f1[i]<f1[j]+1)//f1[i]<f1[j]+1,很关键的条件,动态问题。
{
f1[i]=f1[j]+1; //no know?
}
}
}
for (int j=n;j>0;j--)
{
f2[j]=1;
for (int i=n;i>j;i--)
{
if (a[j]>a[i]&&f2[j]<f2[i]+1)
{
f2[j]=f2[i]+1;
}
}
}
int sum=0;
for (int i=1;i<=n;i++)
{
int tmp=f1[i]+f2[i]-1;
if (tmp>sum)
{
sum=tmp; //max
}
}
cout<<n-sum<<endl;
system("Pause");
return 0;
}