NC15750. 排名
描述
输入描述
输入数据有多组数据,对于每组数据,格式为:
第一行,一个整数n,表示选手数量。
接下来n行,每一行有用空格隔开的一个字符串和五个整数,分别表示选手姓名、NOIP2017成绩以及SDOI2018四天比赛的成绩。
输出描述
输出数据应有多组,每组输出有多行,每行应有一个选手姓名和他的总分。
输出的总分应保留5位小数,且如果总分的误差不超过10-5,我们认为两名选手并列。
若两名选手并列,则按姓名的字典序顺序从小到大输出。
示例1
输入:
7 tzt 570 290 155 300 295 tyc 570 260 225 295 300 rqy 540 275 110 290 290 cz 520 260 130 285 290 hly 490 185 155 290 285 zhx 510 220 110 285 285 dzm 510 185 85 280 280
输出:
tyc 589.74138 tzt 574.16667 rqy 539.89262 cz 534.91682 hly 515.95886 zhx 512.77374 dzm 490.38869
C++14(g++5.4) 解法, 执行用时: 633ms, 内存消耗: 16748K, 提交时间: 2020-02-04 12:50:55
#include <bits/stdc++.h> using namespace std; struct s{ int a,b,c,d,e; double h; string y; }x[200005]; bool cmp(s m,s n){ if(m.h==n.h)return m.y<n.y; else return m.h>n.h; } int n,i; int main(){ while(cin>>n){ int ma=0,mb=0,mc=0,md=0,me=0; for(i=0;i<n;i++){ cin >> x[i].y >> x[i].a >> x[i].b >> x[i].c >> x[i].d >> x[i].e; ma=max(ma,x[i].a);mb=max(mb,x[i].b);mc=max(mc,x[i].c);md=max(md,x[i].d);me=max(me,x[i].e); } for(i=0;i<n;i++)x[i].h=x[i].a*150.0/ma+x[i].b*75.0/mb+x[i].c*75.0/mc+x[i].d*150.0/md+x[i].e*150.0/me; sort(x, x + n, cmp); for(i=0;i<n;i++){ cout<<x[i].y<<" "; printf("%.5f\n",x[i].h); } } }
C++ 解法, 执行用时: 444ms, 内存消耗: 16740K, 提交时间: 2021-06-13 10:32:19
#include<bits/stdc++.h> using namespace std; struct s { int a,b,c,d,e; double h; string y; }x[200001]; bool cmp(s m,s n) { if(m.h==n.h) return m.y<n.y; else return m.h>n.h; } int n,i; int main() { while(cin>>n) { int ma=0,mb=0,mc=0,md=0,me=0; for(i=0;i<n;i++) { cin>>x[i].y>>x[i].a>>x[i].b>>x[i].c>>x[i].d>>x[i].e; ma=max(ma,x[i].a);mb=max(mb,x[i].b);mc=max(mc,x[i].c);md=max(md,x[i].d);me=max(me,x[i].e); } for(i=0;i<n;i++) x[i].h=x[i].a*150.0/ma+x[i].b*75.0/mb+x[i].c*75.0/mc+x[i].d*150.0/md+x[i].e*150.0/me; sort(x,x+n,cmp); for(i=0;i<n;i++) { cout<<x[i].y<<" "; printf("%.5f\n",x[i].h); } } }