大家好,我是林译川,今天我们来聊一聊一个有趣的问题:如何实现合影效果的排序问题?这个问题在信息学奥赛中经常出现,它考验的是我们对排序算法的理解和应用。
解题思路
这个问题主要有两种解法:
- 解法1:将男生身高和女生身高分别排序。
- 解法2:整合为一个比较条件,统一排序。
解法1:分别排序
首先,我们将男生和女生的身高分别存储在两个不同的数组中。然后,对男生数组进行升序排序,对女生数组进行降序排序。最后,分别输出两个数组的元素。
#include <bits/stdc++.h>
using namespace std;
bool cmpDown(double a, double b) //降序
{
return a > b;
}
int main()
{
char s[10]; //保存性别字符串
double a, male[45], female[45];
int n, mi = 0, fi = 0; //mi:male中元素个数 fi:female中元素个数
cin >> n;
for(int i = 1; i <= n; ++i)
{
cin >> s >> a;
if(s[0] == 'm')
male[++mi] = a;
else
female[++fi] = a;
}
sort(male+1, male+1+mi); //男生升序排序 sort默认升序
sort(female+1, female+1+fi, cmpDown); //女生降序排序
for(int i = 1; i <= mi; ++i)
cout << fixed << setprecision(2) << male[i] < ' ';
for(int i = 1; i <= fi; ++i)
cout << fixed << setprecision(2) << female[i] < ' ';
return 0;
}
解法2:整合比较条件
第二种方法是将男生和女生的排序条件整合为一个比较函数。我们定义一个结构体来存储学生的性别和身高,并重载小于运算符来判断两个学生应该的排序顺序。
#include <bits/stdc++.h>
using namespace std;
struct Stu
{
char s[15]; //性别
double h; //身高
bool operator < (const Stu &b) const //返回自身是否应该排在b的前面
{
if(s[0] == 'm' && b.s[0] == 'm') //都是男生,更矮的在前面
return h < b.h;
else if(s[0] == 'f' && b.s[0] == 'f') //都是女生,更高的排在前面
return h > b.h;
else //一男一女
return s[0] == 'm'; //如果本身是男生,自己应该排在前面,返回真。如果本身不是男生,自己不该排在前面,返回假。
}
};
int main()
{
Stu a[45];
int n;
cin >> n;
for(int i = 1; i <= n; ++i)
cin >> a[i].s >> a[i].h;
sort(a+1, a+1+n);
for(int i = 1; i <= n; ++i)
cout << fixed << setprecision(2) << a[i].h < ' ';
return 0;
}
以上就是合影效果排序问题的两种解法,希望能帮助到大家。
如果你对编程思维培养或者技术设计思想有更多的疑问,欢迎访问「新派编程网」(www.xjpbg.com)了解更多内容。
