输入格式: 输入第一行给出 3 个正整数,分别为:N(≤10 5 ),即考生总数;L(≥60),为录取最低分数线,即德分和才分均不低于 L 的考生才有资格被考虑录取;H(<100),为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分不到但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;德才分均低于 H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;其他达到最低线 L 的考生也按总分排序,但排在第三类考生之后。
随后 N 行,每行给出一位考生的信息,包括:准考证号 德分 才分,其中准考证号为 8 位整数,德才分为区间 [0, 100] 内的整数。数字间以空格分隔。
输出格式: 输出第一行首先给出达到最低分数线的考生人数 M,随后 M 行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
思路:其实就是一个排序问题,我们要将其分解为四个小排序问题,然后分别处理即可。详细见代码
#include<bits/stdc++.h>
#define MAXN 100100
using namespace std;
typedef long long ll;
ll N,L,H;
ll aa,bb,cc,dd;
ll k1=0,k2=0,k3=0,k4=0;
ll tot = 0;
struct node{
ll xuhao;
ll de;
ll cai;
ll sum;
}one[MAXN],second[MAXN],third[MAXN],fourth[MAXN];
ll cmpp(node x,node y){
if(x.sum == y.sum){
if(x.de == y.de) return x.xuhao < y.xuhao;
else return x.de > y.de;
}
else
return x.sum > y.sum;
}
int main(){
cin>>N>>L>>H;
for(ll i=0;i<N;i++){
cin>>aa>>bb>>cc;
if(bb>=L && cc>=L) tot ++;
if(bb>=H && cc>=H){//德才双全
one[k1].xuhao = aa;
one[k1].de = bb;
one[k1].cai = cc;
one[k1].sum = bb + cc;
k1++;
}
else if(bb>=H &&(cc>=L && cc<H)){//德胜才
second[k2].xuhao = aa;
second[k2].de = bb;
second[k2].cai = cc;
second[k2].sum = bb+cc;
k2++;
}
else if((bb < H && bb >=L) && (cc < H && cc>=L) && bb >= cc){//才胜德
third[k3].xuhao = aa;
third[k3].de = bb;
third[k3].cai = cc;
third[k3].sum = bb+cc;
k3++;
}
else if(bb>=L && cc>=L){
fourth[k4].xuhao = aa;
fourth[k4].de = bb;
fourth[k4].cai = cc;
fourth[k4].sum = bb+cc;
k4++;
}
}
sort(one,one+k1,cmpp);
sort(second,second+k2,cmpp);
sort(third,third+k3,cmpp);
sort(fourth,fourth+k4,cmpp);
cout<<tot<<endl;
for(ll i =0;i<k1;i++){
cout<<one[i].xuhao<<" "<<one[i].de<<" "<<one[i].cai<<endl;
}
for(ll i =0;i<k2;i++){
cout<<second[i].xuhao<<" "<<second[i].de<<" "<<second[i].cai<<endl;
}
for(ll i =0;i<k3;i++){
cout<<third[i].xuhao<<" "<<third[i].de<<" "<<third[i].cai<<endl;
}
for(ll i =0;i<k4;i++){
cout<<fourth[i].xuhao<<" "<<fourth[i].de<<" "<<fourth[i].cai<<endl;
}
return 0;
}