巨人排队,贪心

巨人国的小学生放假了,老师要给小朋友们排队了。可是这个老师有强迫症,一定要路队上的小朋友按照身高从高到矮排序(也就是排在前面的不能比后面的矮)。小朋友呢也很调皮,一旦老师给他排好队就不愿意动了。这个时候小朋友们一个一个的从教室里出来了,每个小朋友一出来老师就要给小朋友安排好位置。请问老师最少要给小朋友排几条路队呢?

输入

对于每组数据,第一行两个数n,表示小朋友总数量(1<=n<=100000) 

第二行n个整数,表示小朋友身高,身高不超过30000(我也觉得很吓人) 

输出

对于每组数据,输出一个整数,表示最少的路队数

样例输入

8
389 207 155 300 299 170 158 65

样例输出

2

注意的点

最高的那个站定后就不能再移动,不能再在前面排人了。

扫描二维码关注公众号,回复: 5769265 查看本文章

前面的不能比后面的矮,高于或等于。

贪心法,每次找出与已经排序的队列的差的最小值

#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;
    }

猜你喜欢

转载自blog.csdn.net/qq_40128883/article/details/88751749
今日推荐