输入排序再输出的一个题。反正是读题要仔细,关键点是四类人的判定和最后输出的排序。output和input讲的输出格式和判定方法都和题干有点不一样。virtue和talent都高于H时为sage,virtue高于H,L<talent<H时为nobelman,剩下的virtue>talent为fool,其它的为smallman,两项有一项小于L的都不算进总数中。开四个vector分别存储、排序、输出。总分相同时输出要按总分>>virtue>>id的顺序排序,前项相同时再比较后项。
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
int n,h,l;
struct Node{
int id,talent,virtue=0;
friend bool operator <(Node a,Node b){
if(a.talent+a.virtue!=b.talent+b.virtue)return a.talent+a.virtue>b.talent+b.virtue;
else if(a.virtue!=b.virtue) return a.virtue>b.virtue;
else return a.id<b.id;
}
};
vector<Node> sage,nobelman,fool,others;
int cnt;
void judge(Node node){
if(node.virtue<l || node.talent<l)return;
if(node.virtue>=h){
if(node.talent>=h){
sage.push_back(node);
}else nobelman.push_back(node);
}else if(node.virtue>=node.talent)fool.push_back(node);
else others.push_back(node);
cnt++;
}
void printvec(vector<Node> v){
if(v.size()==0)return;
sort(v.begin(),v.end());
for(int i=0;i<v.size();i++){
printf("%08d %d %d\n",v[i].id,v[i].virtue,v[i].talent);
}
}
int main() {
scanf("%d %d %d",&n,&l,&h);
for(int i=0;i<n;i++){
Node node;
scanf("%d%d%d",&node.id,&node.virtue,&node.talent);
judge(node);
}
printf("%d\n",cnt);
printvec(sage);
printvec(nobelman);
printvec(fool);
printvec(others);
}