方法:排序,不同类的人赋予不同的优先级,然后按序输出。
注意点:存在无效数据。
#include <iostream>
#include <algorithm>
using namespace std;
struct person{
int id,virtue,talent,flag;
person(){
flag=0;
}
}pe[100010];
int low,high,N,validn=0;
bool cmp(person a,person b){
if(a.flag!=b.flag) return a.flag>b.flag;
else if(a.virtue+a.talent!=b.virtue+b.talent) return a.virtue+a.talent>b.virtue+b.talent;
else if(a.virtue!=b.virtue) return a.virtue>b.virtue;
else return a.id<b.id;
}
int main(){
scanf("%d%d%d",&N,&low,&high);
for(int i=0;i<N;i++){
scanf("%d%d%d",&pe[validn].id,&pe[validn].virtue,&pe[validn].talent);
if(pe[validn].virtue<low||pe[validn].talent<low) continue; //无效数据
if(pe[validn].virtue>=high&&pe[validn].talent>=high) pe[validn++].flag=4; //圣人
else if(pe[validn].virtue>=high&&pe[validn].talent<high) pe[validn++].flag=3; //君子
else if(pe[validn].virtue<high&&pe[validn].talent<high&&pe[validn].virtue>=pe[validn].talent) pe[validn++].flag=2; //愚人
else pe[validn++].flag=1; //小人
}
sort(pe,pe+validn,cmp);
printf("%d\n",validn);
for(int i=0;i<validn;i++)
printf("%08d %d %d\n",pe[i].id,pe[i].virtue,pe[i].talent);
return 0;
}