【题目链接】
ybt 1182:合影效果
OpenJudge NOI 1.10 07:合影效果
【题目考点】
1. 排序
【解题思路】
解法1:将男生身高和女生身高分别排序
将男生身高和女生身高分别存在两个不同的数组中,男生升序排序,女生降序排序,分别输出。
解法2:整合为一个比较条件
设函数判断两个学生哪个应该排在前面
- 如果一个是男生一个是女生,男生排在前面
- 如果都是男生,身高更矮的排在前面
- 如果都是女生,身高更高的排在前面
这样就得到了一个比较条件。用这个比较条件去做排序即可。
数据只有40个,用什么排序方法都可以。
【题解代码】
解法1:将男生身高和女生身高分别排序
- 使用STL sort函数排序
#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;
}
- 插入排序+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;
}