SDNUOJ 1281
阿新 • • 發佈:2018-12-10
Description
小明期末考試要考高數、計算機基礎、英語三門學科,每科得分都是百分制,最後有個按照總分的排名,請你幫他算出他們班的第一名是誰。(總分=計算機基礎60%+高數30%+英語*30%)如果若干人總分相同,則再按照計算機基礎分高低取第一,如果還相同,再看數學…再看英語…如果三門成績完全一樣,則他們並列第一併按照名字升序輸出。
Input
第一行N,代表有N位同學參加排名,1≤N≤100
接下來的N行表示每一名同學的成績,每一行首先是同學的名稱,之後是該同學的成績(計算機基礎 高數 英語)。聯絡人的姓名不會超過50個字元,只包含英文大寫字母。成績均為百分制。
Output
輸出第一名,若成績完全一樣,按照姓名升序輸出,每行一個名字
Sample Input
4
SQC 90 60 79
HC 60 90 90
ZJQ 80 85 92
RDJ 66 87 79
Sample Output
ZJQ
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; struct grade { char name[55]; double computer;///double比int更精確,可當成int用 double math; double english; double sum; } a[105]; int cmp(grade a,grade b) { if(a.sum!=b.sum) return a.sum<b.sum; else { if(a.computer!=b.computer) return a.computer<b.computer; else { if(a.math!=b.math) return a.math<b.math; else { if(a.english!=b.english) return a.english<b.english; else { ///名字升序的一種比較方法,不能寫return a.name < b.name也不能寫(詳情請看我的另一篇部落格字串升序)return(strcmp(a.name,b.name)<0) int len = max(strlen(a.name), strlen(b.name)); for(int i=0; i<len; i++) { if(a.name[i]!=b.name[i]) return a.name[i]<b.name[i]; } } } } } } int main() { int n; while(~scanf("%d",&n)) { for(int i=0; i<n; i++) { scanf("%s",a[i].name); scanf("%lf%lf%lf",&a[i].computer,&a[i].math,&a[i].english); a[i].sum=0.6*a[i].computer+0.3*a[i].math+0.3*a[i].english; } sort(a,a+n,cmp); cout<<a[n-1].name<<endl; for(int i=n-2; i>=0; i--) { if(a[i].sum==a[n-1].sum && a[i].computer == a[n-1].computer && a[i].math == a[n-1].math && a[i].english == a[n-1].english) { cout<<a[i].name<<endl; } else break; } } return 0; }