1. 程式人生 > >【PAT】B1015 德才論

【PAT】B1015 德才論

ont string 簡單 tor 優先 定義 錄取 can clu

這道題算是挺簡單,我在群裏看到的別人琢磨好久過不去,大多是因為沒有考慮好四種等級的判斷條件
一定要保證四種判斷條件正確。
下面這是我的代碼,比較笨。後邊有別人那學來的聰明些的方法

#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;
}

【PAT】B1015 德才論