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 }
原文地址:https://www.cnblogs.com/tangyimin/p/10546993.html
时间: 2024-11-05 21:47:21