【PAT】B1015 德才論
阿新 • • 發佈:2018-10-19
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 德才論