这一题是比较简单的排序题,难点在于如何对 sage、nobleman、fool men进行排序。一开始我的想法是用多个数组进行分别存储,但是操作起来就变得繁琐,于是我看了别人的解法,设置标志就能轻松解决。
算法步骤:
- 建立结构体
- 编写比较函数(注意对标志进行比较)
- 将输入数据存储到结构体数组中
- 同时对每一条数据设置标记
- 对数组进行排序
- 输出符合条件的数据
在设置标记的过程中,我写的方法比较繁琐,而网上的标志设置过程中明显是有技巧的,首先把不符合条件数据筛选出来。
方法:
if(virtue<lowGrade||talent<lowGrade){
people[i].flag = 5;
cnt++;
}else if(virtue>=highGrade&&talent>=highGrade){
people[i].flag = 1;
}else if(virtue>=highGrade&&talent<highGrade){
people[i].flag = 2;
}else if(virtue>=talent){
people[i].flag = 3;
}else {
people[i].flag = 4;
}
代码如下
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct person{
char name[10];
int virtue;
int talent;
int total;
int flag;
} people[100005];
bool cmp(person a,person b){
if(a.flag!=b.flag){
return a.flag < b.flag;
}else if(a.total!=b.total){
return a.total > b.total;
}else if(a.virtue!=b.virtue){
return a.virtue > b.virtue;
}else{
int s = strcmp(a.name, b.name);
return s < 0;
}
}
int main(){
int n, lowGrade, highGrade;
scanf("%d %d %d", &n, &lowGrade, &highGrade);
int cnt = 0;
for (int i = 0; i < n;i++){
scanf("%s %d %d", people[i].name, &people[i].virtue, &people[i].talent);
people[i].total = people[i].virtue + people[i].talent;
int virtue = people[i].virtue;
int talent = people[i].talent;
if(virtue<lowGrade||talent<lowGrade){
people[i].flag = 5;
cnt++;
}else if(virtue>=highGrade&&talent>=highGrade){
people[i].flag = 1;
}else if(virtue>=highGrade&&talent<highGrade){
people[i].flag = 2;
}else if(virtue>=talent){
people[i].flag = 3;
}else {
people[i].flag = 4;
}
}
sort(people, people + n, cmp);
int total = n - cnt;
printf("%d\n", total);
for (int i = 0; i < total;i++){
printf("%s %d %d\n", people[i].name, people[i].virtue, people[i].talent);
}
}