PAT甲级 1062 Talent and Virtue (25分)

1062 Talent and Virtue (25分)

题目链接:PAT A 1062
在这里插入图片描述
在这里插入图片描述
题目大意:输入第一行给出考生总数,合格分数线以及优秀分数线。接下来每行给出考生的id,品德分数,才能分数。首先考生的品德分数和才能分数必须都大于等于合格分数线才能参与排名(划重点),之后考生分为几档,第一档是圣人,要求考生品德分数和才能分数都大于等于优秀分数线;第二档是君子,要求考生品德分数大于等于优秀分数线,但才能分数小于优秀分数线;第三档是愚人,要求考生品德分数和才能分数都低于优秀分数线但是品德分数要大等于才能分数,其余的人(指参与排名的人,即品德分数和才能分数大于等于合格分数线)被认为是第四档,即小人。输出时要求圣人考生最先输出,小人考生最后输出。对于每一档的考生,要按照总分由高到低进行输出,如果总分相同,按照品德分数降序输出,如果品德分数也相同,按照id升序输出。

思路分析:建立结构体数组,将不同档次的考生加入到不同的结构体数组中,之后按照题目要求对每一个档次的结构体数组进行排序,最后输出即可。

AC代码:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct people{
	int id, virtue, talent, sum;
};
bool cmp(people a, people b) {
	if(a.sum != b.sum) //总分不同 
		return a.sum > b.sum;
	else if(a.virtue != b.virtue) //总分相同,品德分数不同 
		return a.virtue > b.virtue;
	else //总分与品德分数都相同,id不同 
		return a.id < b.id;
}
int main() {
	int n, l, h, cnt = 0;
	scanf("%d %d %d", &n, &l, &h);
	vector<people> v[4]; //v[0]-v[3]代表四个档次的人,v[0]代表圣人,v[3]代表小人 
	for(int i = 0; i < n; i++) {
		people a;
		scanf("%d %d %d", &a.id, &a.virtue, &a.talent);
		a.sum = a.virtue + a.talent; //计算总分 
		if(a.virtue >= l && a.talent >= l) { //重要条件,只有品德分和才能分都大于等于合格分数线才能排名 
			cnt++; //统计参与排名的人数 
			if(a.virtue >= h && a.talent >= h) //圣人 
				v[0].push_back(a);
			else if(a.virtue >= h && a.talent < h) //君子 
				v[1].push_back(a);
			else if(a.virtue < h && a.talent < h && a.virtue >= a.talent) //愚人 
				v[2].push_back(a);
			else //小人 
				v[3].push_back(a);
		}
	}
	printf("%d\n", cnt); //输出参与排名的人数 
	for(int i = 0; i < 4; i++) {
		sort(v[i].begin(), v[i].end(), cmp); //对每一档的人进行排序 
		for(int j = 0; j < v[i].size(); j++)
			printf("%d %d %d\n", v[i][j].id, v[i][j].virtue, v[i][j].talent);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值