巨人国的小学生放假了,老师要给小朋友们排队了。可是这个老师有强迫症,一定要路队上的小朋友按照身高从高到矮排序(也就是排在前面的不能比后面的矮)。小朋友呢也很调皮,一旦老师给他排好队就不愿意动了。这个时候小朋友们一个一个的从教室里出来了,每个小朋友一出来老师就要给小朋友安排好位置。请问老师最少要给小朋友排几条路队呢?
输入
对于每组数据,第一行两个数n,表示小朋友总数量(1<=n<=100000)
第二行n个整数,表示小朋友身高,身高不超过30000(我也觉得很吓人)
输出
对于每组数据,输出一个整数,表示最少的路队数
样例输入
8 389 207 155 300 299 170 158 65
样例输出
2
注意的点
最高的那个站定后就不能再移动,不能再在前面排人了。
前面的不能比后面的矮,高于或等于。
贪心法,每次找出与已经排序的队列的差的最小值
#include <iostream>
#include <queue>
using namespace std;
typedef struct que{
int max,min;
};
int main(){
int n;
while(cin>>n){
que q[n];
int kid[n];
int count=0;
for(int i=0;i<n;++i){
q[i].max = 0,q[i].min = 0;
}
for(int i=0;i<n;++i){
cin>>kid[i];
int tmp=30001;int sel;int type = 1;
for(int j=0;j<count;++j){
if(q[j].min-kid[i]<tmp&&q[j].min>=kid[i]){
sel = j;
tmp = q[j].min-kid[i];
type = 0;
}
}
if(type){
count++;
q[count-1].max = kid[i];
q[count-1].min = kid[i];
}else{
q[sel].min = kid[i];
}
}
cout<<count<<endl;
}
}