信息学奥赛一本通 1182:合影效果 | OpenJudge NOI 1.10 07:合影效果

【题目链接】

ybt 1182:合影效果
OpenJudge NOI 1.10 07:合影效果

【题目考点】

1. 排序

【君义精讲】排序算法

【解题思路】

解法1:将男生身高和女生身高分别排序

将男生身高和女生身高分别存在两个不同的数组中,男生升序排序,女生降序排序,分别输出。

解法2:整合为一个比较条件

设函数判断两个学生哪个应该排在前面

  • 如果一个是男生一个是女生,男生排在前面
  • 如果都是男生,身高更矮的排在前面
  • 如果都是女生,身高更高的排在前面

这样就得到了一个比较条件。用这个比较条件去做排序即可。
数据只有40个,用什么排序方法都可以。

【题解代码】

解法1:将男生身高和女生身高分别排序
  • 使用STL sort函数排序
#include <bits/stdc++.h>
using namespace std;
bool cmpUp(double a, double b)//升序 
{
    return a < b;
}
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, cmpUp);//男生升序排序 
    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;
}
  • 插入排序+scanf、printf
#include <bits/stdc++.h>
using namespace std;
int main()
{
    char s[10];//保存性别字符串 
    double a, male[45], female[45];
    int n, mi = 0, fi = 0;//mi:male中元素个数 fi:female中元素个数 
	scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
	{
	    scanf("%s %lf", s, &a);
	    if(s[0] == 'm')
	    {
            male[++mi] = a;
            for(int j = mi; j > 1; --j)
            {
                if(male[j] < male[j-1])//男生升序排序 
                    swap(male[j], male[j-1]);
                else
                    break;
            }
        }
        else
        {
            female[++fi] = a;
            for(int j = fi; j > 1; --j)
            {
                if(female[j] > female[j-1])//女生降序排序
                    swap(female[j], female[j-1]);
                else
                    break;
            }
        }
    }
    for(int i = 1; i <= mi; ++i)
        printf("%.2f ", male[i]);
    for(int i = 1; i <= fi; ++i)
        printf("%.2f ", female[i]);
	return 0;
}
解法2:整合为一个比较条件
  • 使用STL sort函数 + 重载<运算符
#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;
}
  • 使用冒泡排序 判断条件写成表达式
#include <bits/stdc++.h>
using namespace std;
struct Stu
{
    char s[15];//性别 
    double h;//身高
};
int main()
{
    Stu a[45];
    int n;
    cin >> n;
	for(int i = 1; i <= n; ++i)
	    cin >> a[i].s >> a[i].h;
    for(int i = 1; i <= n-1; ++i)//冒泡排序 
        for(int j = 1; j <= n-i; ++j)
            if(a[j].s[0] == 'm' &&  a[j+1].s[0] == 'm' && a[j].h > a[j+1].h ||//都是男生,更矮的在前面 
            a[j].s[0] == 'f' &&  a[j+1].s[0] == 'f' && a[j].h < a[j+1].h ||//都是女生,更高的排在前面
            a[j].s[0] == 'f' && a[j+1].s[0] == 'm')//性别不同,男在前女在后
                swap(a[j], a[j+1]);
    for(int i = 1; i <= n; ++i)
        cout << fixed << setprecision(2) << a[i].h << ' '; 
	return 0;
}
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值