PAT 1062 排序

题目

题目过长不再赘述
本质上要求按照以下顺序排序

  1. 如果德才都超过平均值,则为最高等级
  2. 如果德才中才低于平均值但德高于平均值,为第二等级
  3. 如果德才均小于平均值但是德大于才,为第三等级
  4. 其余为第四等级
  5. 若德才有一个低于及格线不参与评级

同等级之间按照如下排序

  1. 第一关键字为德才总分
  2. 第二关键字为德
  3. 第三关键字为id

代码和思路

  1. 有了排序的思路后只需要写出相关的排序代码即可
  2. 为了排序方便,我们设置结构体people, 其中包含着德才分和id,同时加一个总分和一个等级标志
  3. 因为有可能测试数据数据量很大,不方便使用cin 和 cout,所以使用字符串数组来处理信息
  4. 设置等级的时候就按照上述的思路顺序进行设置,这样符合if else的递进判断逻辑
  5. 排好序后按序输出就行
#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值