这道题算是挺简单,我在群里看到的别人琢磨好久过不去,大多是因为没有考虑好四种等级的判断条件
一定要保证四种判断条件正确。
下面这是我的代码,比较笨。后边有别人那学来的聪明些的方法

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
struct student{
    int number,de,cai,sum;
}A[100000],//H(<100为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,
B[100000],//才分不到但德分到线的一类考生属于“德胜才”,
C[100000],//德才分均低于H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者
D[100000];//其他达到最低线L的考生也
int num=0;
bool cmp(student A,student B){
    if(A.sum!=B.sum) return A.sum>B.sum;
    else if(A.de!=B.de) return A.de>B.de;
    else return A.number<B.number;
}
void prr(student *arr,int Si){
    for(int i=0;i<Si;i++){
        printf("%08d %d %d",arr[i].number,arr[i].de,arr[i].cai);
        num--;
        if(num!=0)printf("\n");
    }
}
int main(){
    int N,L,H,AA,BB,CC,DD;
    AA=BB=CC=DD=0;
    student temp;
    scanf("%d%d%d",&N,&L,&H);
    for(int i=0;i<N;i++){
        scanf("%d %d %d",&temp.number,&temp.de,&temp.cai);
        temp.sum=temp.de+temp.cai;
        if(temp.de>=L&&temp.cai>=L){
            num++;
            if(temp.cai>=H&&temp.de>=H){A[AA++]=temp;continue;}
            if(temp.de>=H&&temp.cai<H) {B[BB++]=temp;continue;}
            if(temp.cai<H&&temp.de<H&&temp.de>=temp.cai){C[CC++]=temp;continue;}
            D[DD++]=temp;
        }
    }
    sort(A,A+AA,cmp);
    sort(B,B+BB,cmp);
    sort(C,C+CC,cmp);
    sort(D,D+DD,cmp);
    printf("%d\n",num);
    prr(A,AA);
    prr(B,BB);
    prr(C,CC);
    prr(D,DD);
    return 0;
}

好方法:
用结构体数组储存数据,每个数据有一个等级变量,通过这个变量和sort函数排序,直接将四种等级分开了,省去好多事

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct stu{
    char id[10];
    int D;int C;
    int flag,sum;
}temp,ex[100010];
bool cmp(stu a,stu b){
    if(a.flag!=b.flag)return a.flag<b.flag;
    else if(a.sum!=b.sum)return a.sum>b.sum;
    else if(a.D!=b.D)return a.D>b.D;
    else return strcmp(a.id,b.id)<0;
}
int main(){
    int N,L,H,local=0;
    scanf("%d %d %d",&N,&L,&H);
    for(int i=0;i<N;i++){
        scanf("%s %d %d",temp.id,&temp.D,&temp.C);
        if(temp.D<L||temp.C<L)continue;
        strcpy(ex[local].id,temp.id);
        ex[local].D=temp.D;
        ex[local].C=temp.C;
        if(ex[local].D>=H&&ex[local].C>=H)ex[local].flag=1;
        else if(ex[local].D>=H&&ex[i].C<H)ex[local].flag=2;
        else if(ex[local].D<H&&ex[local].C<H&&ex[local].D>=ex[local].C)ex[local].flag=3;
        else ex[local].flag=4;
        ex[local].sum=ex[local].D+ex[local].C;
        local++;
    }
    sort(ex,ex+local,cmp);
    printf("%d\n",local);
    for(int i=0;i<local;i++){
        printf("%s %d %d\n",ex[i].id,ex[i].D,ex[i].C);
    }
    return 0;
}