1023: 巨人排队(2017年中南大学研究生复试机试题 )

1023: 巨人排队

时间限制: 1 Sec  内存限制: 128 MB
提交: 185  解决: 58
[ 提交] [ 状态] [ 讨论版] [命题人:外部导入]

题目描述

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

输入

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

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

输出

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

样例输入

8
389 207 155 300 299 170 158 65

样例输出

2

提示

最少要排两条路队,其中一种方案是398-207-155-65 和 300-299-170-158
 
 1 #include<iostream>
 2 
 3 using namespace std;
 4 /*此题的核心思想是贪心算法,每次都尽量排在队尾小朋友与欲排队小朋友身高差距最小的队伍*/
 5 int studentQue[100005];
 6 int dex[100005];
 7 int main12(){//小朋友呢也很调皮,一旦老师给他排好队就不愿意动了,意思是新来的只能排在
 8     //队伍的最后面而不能进行插入队伍 
 9     int n;
10     while (cin >> n){
11         int num = 1;
12         for (int i = 1; i <= n; i++){
13             cin >> studentQue[i];
14         }
15         dex[1] = studentQue[1];
16         for (int i = 2; i <= n; i++){
17             bool flag = true;
18             bool flag1 = true;
19             int min = 30001;
20             int imin = 1;
21             for (int j = 1; j <= num; j++){//找现有队伍里队尾身高最接近的队伍插入 
22                 int a = dex[j] - studentQue[i];
23                 if (a >= 0 && a<min){
24                     min = a;
25                     imin = j;
26                     flag1 = false;
27                 }
28                 
29             }
30             if (!flag1){//比第j队的队尾矮就入队 
31                 //cout<<"dex:"<<dex[imin]<<"stu:"<<studentQue[i]<<endl;
32                 dex[imin] = studentQue[i];
33                 flag = false;
34             }
35             //如果没有合适的队伍可以排,就新开一条队伍
36             if (flag){
37                 num++;
38                 dex[num] = studentQue[i];
39             }
40         }
41         cout << num << endl;
42     }
43     return 0;
44 }

猜你喜欢

转载自www.cnblogs.com/tangyimin/p/10546993.html
今日推荐