【pat】1015 德才论

分析

本题需要分为几个等级:
1、德与才均超过优先录取线;
2、德超过而才没有超过优先录取线;
3、德与才均未超过优先录取线,但是德分高于才分;
4、德与才均超过最低录取线但不符合前三种情况
5、德与才均未超过最低录取线。
考生按输入中说明的规则从高到低(按等级,等级相同按总分)排序,当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。

1.sort多重条件排序
2.超时问题:
身份证id如果定义成string类型会超时,这里用char

#include <iostream>
#include<string.h>
#include<algorithm>

using namespace std;
struct student { //创建结构体来存放准考证号、德、才、总分数
	char id[9];
	int d, c, sum; //德分、才分、总分
	int l; //定义一个等级,用来判断排序的优先顺序
} a[100001];
bool cmp(student a, student b) { //按照题意来排序,优先顺序为:德分和才分均不低于优先录取线,才分不到但德分到线,德才分均低于优先录取线,但是德分大于才分
	if (a.l != b.l)
		return a.l < b.l;
	else if (a.sum != b.sum)
		return a.sum > b.sum;
	else if (a.d != b.d)
		return a.d > b.d;
	else
		return strcmp(a.id, b.id) < 0; //按照字母顺序从小到大
}
int main() {
	int N, L, H;
	int i;
	int num;
	cin >> N >> L >> H;
	num = N;
	for (i = 0; i < N; i++) {
		cin >> a[i].id >> a[i].d >> a[i].c;
		a[i].sum = a[i].d + a[i].c;
		if (a[i].d < L || a[i].c < L) {
			a[i].l = 5;
			num--; //减去未及格的
		} else if (a[i].d >= H && a[i].c >= H)
			a[i].l = 1;
		else if (a[i].d >= H && a[i].c < H)
			a[i].l = 2;
		else if (a[i].d >= a[i].c)
			a[i].l = 3;
		else
			a[i].l = 4;
	}
	sort(a, a + N, cmp);
	cout << num << endl;
	for (i = 0; i < num; i++)
		cout << a[i].id << " " << a[i].d << " " << a[i].c << endl;
	return 0;
}

posted @ 2020-04-10 19:54  青山_1997  阅读(129)  评论(0编辑  收藏  举报