题目
题目过长不再赘述
本质上要求按照以下顺序排序
- 如果德才都超过平均值,则为最高等级
- 如果德才中才低于平均值但德高于平均值,为第二等级
- 如果德才均小于平均值但是德大于才,为第三等级
- 其余为第四等级
- 若德才有一个低于及格线不参与评级
同等级之间按照如下排序
- 第一关键字为德才总分
- 第二关键字为德
- 第三关键字为id
代码和思路
- 有了排序的思路后只需要写出相关的排序代码即可
- 为了排序方便,我们设置结构体people, 其中包含着德才分和id,同时加一个总分和一个等级标志
- 因为有可能测试数据数据量很大,不方便使用cin 和 cout,所以使用字符串数组来处理信息
- 设置等级的时候就按照上述的思路顺序进行设置,这样符合if else的递进判断逻辑
- 排好序后按序输出就行
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<iostream>
using namespace std;
struct people {
char id[10];
int v, t, sum;
int flag;
};
vector < people > peo;
bool cmp(people a, people b) {
if (a.flag != b.flag) return a.flag < b.flag;
else if (a.sum != b.sum) return a.sum > b.sum;
else if (a.v != b.v) return a.v > b.v;
else return strcmp(a.id, b.id) < 0;
}
int main() {
int _t, _v;
char _id[10];
int n, low, high;
people p;
scanf("%d %d %d", &n, &low, &high);
getchar();
for (int i = 0; i < n; i++) {
scanf("%s", &p.id);
scanf("%d %d", &_v, &_t);
if (_v < low || _t < low) continue;
if (_v >= high && _t >= high) p.flag = 1;
else if (_v >= high) p.flag = 2;
else if (_v >= _t) p.flag = 3;
else p.flag = 4;
p.v = _v; p.t = _t; p.sum = _v + _t;
peo.push_back(p);
}
sort(peo.begin(), peo.end(), cmp);
printf("%d\n", peo.size());
for (int i = 0; i < peo.size(); i++) {
printf("%s", peo[i].id);
printf(" %d %d\n", peo[i].v, peo[i].t);
}
return 0;
}