1062 Talent and Virtue (25 分)排序(水题)

版权声明:假装这里有个版权声明…… https://blog.csdn.net/CV_Jason/article/details/85327352

题目

About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about people’s talent and virtue. According to his theory, a man being outstanding in both talent and virtue must be a “sage(圣人)”; being less excellent but with one’s virtue outweighs talent can be called a “nobleman(君子)”; being good in neither is a “fool man(愚人)”; yet a fool man is better than a “small man(小人)” who prefers talent than virtue.

Now given the grades of talent and virtue of a group of people, you are supposed to rank them according to Sima Guang’s theory.

Input Specification:
Each input file contains one test case. Each case first gives 3 positive integers in a line: N ( 105 ) N (≤105) , the total number of people to be ranked; L ( 60 ) L (≥60) , the lower bound of the qualified grades – that is, only the ones whose grades of talent and virtue are both not below this line will be ranked; and H ( < 100 ) H (<100) , the higher line of qualification – that is, those with both grades not below this line are considered as the “sages”, and will be ranked in non-increasing order according to their total grades. Those with talent grades below H but virtue grades not are cosidered as the “noblemen”, and are also ranked in non-increasing order according to their total grades, but they are listed after the “sages”. Those with both grades below H, but with virtue not lower than talent are considered as the “fool men”. They are ranked in the same way but after the “noblemen”. The rest of people whose grades both pass the L line are ranked after the “fool men”.

Then N lines follow, each gives the information of a person in the format:

ID_Number Virtue_Grade Talent_Grade

where ID_Number is an 8-digit number, and both grades are integers in [0, 100]. All the numbers are separated by a space.

Output Specification:
The first line of output must give M ( N ) M (≤N) , the total number of people that are actually ranked. Then M lines follow, each gives the information of a person in the same format as the input, according to the ranking rules. If there is a tie of the total grade, they must be ranked with respect to their virtue grades in non-increasing order. If there is still a tie, then output in increasing order of their ID’s.

Sample Input:

14 60 80
10000001 64 90
10000002 90 60
10000011 85 80
10000003 85 80
10000004 80 85
10000005 82 77
10000006 83 76
10000007 90 78
10000008 75 79
10000009 59 90
10000010 88 45
10000012 80 100
10000013 90 99
10000014 66 60

Sample Output:

12
10000013 90 99
10000012 80 100
10000003 85 80
10000011 85 80
10000004 80 85
10000007 90 78
10000006 83 76
10000005 82 77
10000002 90 60
10000014 66 60
10000008 75 79
10000001 64 90

解题思路

  题目大意: 给定两个分界线H和L,给你N个人的id和德、才分数,按照如下规则排序——
  1. 德才都超过H的,是圣人,排第一位;
  2. 才华低于H,但是高于L,但是德高于H,是君子,排第二位;
  3. 德才均在[L,H)之间,但是德比才高,是愚者,排第三位;
  4. 然后是德才都超过L的部分;
  5. 德才只要有一个不过L的,不参与排名。
  解题思路: 把规则弄清楚了之后,直接用sort排序即可,考虑到数据量N的规模比较大,使用scanf和printf作为输入输出。

/*
** @Brief:No.1061 of PAT advanced level.
** @Author:Jason.Lee
** @Date:2018-12-28
** @Solution: Accepted!
*/
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
struct people{
	int talent;
	int virtue;
	int id;
	int flag;
};
bool cmp(people a,people b){
	if(a.flag==b.flag){
		if((a.virtue+a.talent)==(b.virtue+b.talent)){
			if(a.virtue==b.virtue){
				return a.id<b.id;
			}else{
				return a.virtue>b.virtue;
			}
		}else{
			return a.virtue+a.talent>b.virtue+b.talent;
		}
	}else{
		return a.flag<b.flag;
	}
}

int main(){
	int N,L,H;
	while(scanf("%d%d%d",&N,&L,&H)!=EOF){
		vector<people> vp;
		people input;
		for(int i=0;i<N;i++){
			scanf("%d%d%d",&input.id,&input.virtue,&input.talent);
			if(input.virtue>=H&&input.talent>=H){// sages
				input.flag = 1;
			}else if((input.talent<H&&input.talent>=L)&&input.virtue>=H){// noblemen
				input.flag = 2;
			}else if((input.virtue<H&&input.virtue>=L) && 
				(input.talent<H&&input.talent>=L) && 
				(input.virtue>=input.talent)){// foolmen
				input.flag = 3;
			}else if(input.virtue>=L&&input.talent>=L){// the rest
				input.flag = 4;
			}else{
				continue;
			}
			vp.push_back(input);
		}		
		sort(vp.begin(),vp.end(),cmp);
		printf("%d\n",vp.size());
		for(auto elem:vp){
			printf("%08d %d %d\n",elem.id,elem.virtue,elem.talent);
		}
	}
	return 0;
}

在这里插入图片描述

总结

  这道题是PTA乙级1015 德才论的英文版,如果英文阅读上没有障碍,基本上没有太大的解题难度。

猜你喜欢

转载自blog.csdn.net/CV_Jason/article/details/85327352