跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

如何实现合影效果的排序问题?

大家好,我是林译川,今天我们来聊一聊一个有趣的问题:如何实现合影效果的排序问题?这个问题在信息学奥赛中经常出现,它考验的是我们对排序算法的理解和应用。

解题思路

这个问题主要有两种解法:

  • 解法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)了解更多内容。

相关文章