排名

鏈接:https://ac.nowcoder.com/acm/problem/15750
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 65536K,其他語言131072K
64bit IO Format: %lld
題目描述
Cwbc和XHRlyb都參加了SDOI2018,他們特別關心自己的排名。
我們定義每一場比賽每位選手的標準分爲它的分數乘以滿分再除以比賽中選手所獲得的最高分。
NOIP2017的滿分爲600分,SDOI2018每一天的比賽滿分均爲300分。
我們定義總分爲NOIP2017的標準分的25%,加上SDOI2018 前兩天標準分之和的25%,再加上SDOI2018後兩天標準分之和的50%。
XHRlyb告訴你每一次比賽每個選手的分數,你需要按照名次從高到低依次輸出他們的名字和總分。
聰明的你在仔細閱讀題目後,一定可以順利的解決這個問題!
輸入描述:
輸入數據有多組數據,對於每組數據,格式爲:
第一行,一個整數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
備註:
保證姓名均爲小寫字母且個數在[2,10]之間,每次比賽的分數不會超過滿分也不會低於0分。
保證選手總數不會超過2 ∗ 105。
1 ≤ T ≤ 5。

思路:這是很頭疼的一題,因爲思路很清晰了,就是排序的事,但就是不知道爲啥,java就是一直超時,後來換成C++就AC了,不知道怎麼說了,或者是我哪裏錯了,還請大佬指點一下。(還好隊友是C++大佬,不然比賽真的就慘了)

java錯誤代碼:

import java.util.Arrays;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int n=sc.nextInt();
            String []name=new String[n];
            Double[]a=new Double[n];
            Double[]b=new Double[n];
            Double[]c=new Double[n];
            Double[]d=new Double[n];
            Double[]e=new Double[n];
            Double maxa=(double) 0,maxb=(double) 0,maxc=(double) 0,
                    maxd=(double) 0,maxe=(double) 0;
            for (int i=0;i<n;i++) {
                name[i]=sc.next();
                a[i]=sc.nextDouble();
                b[i]=sc.nextDouble();
                c[i]=sc.nextDouble();
                d[i]=sc.nextDouble();
                e[i]=sc.nextDouble();
                maxa=maxa>a[i]?maxa:a[i];
                maxb=maxb>b[i]?maxb:b[i];
                maxc=maxc>c[i]?maxc:c[i];
                maxd=maxd>d[i]?maxd:d[i];
                maxe=maxe>e[i]?maxe:e[i];
            }
            lin []arr=new lin[n];
            for (int i=0;i<n;i++) {
                arr[i]=new lin();
                arr[i].name=name[i];
                arr[i].sum+=((a[i]*600)/maxa)/4;
                arr[i].sum+=(((b[i]*300)/maxb)+((c[i]*300)/maxc))/4;
                arr[i].sum+=(((d[i]*300)/maxd)+((e[i]*300)/maxe))/2;
            }
            Arrays.sort(arr,0,n);
            for (int i=0;i<n;i++) {
                System.out.print(arr[i].name+" ");
                System.out.printf("%.5f",arr[i].sum);
                System.out.println();
            }
        }
        sc.close();
   }
}
class lin implements Comparable<lin>{
    String name;
    double sum;
    double a,b,c,d,e;
    public int compareTo(lin n) {
        if(n.sum>this.sum)
            return 1;
        else
            return -1;
    }
}

C++的代碼(AC):

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <algorithm>
using namespace std;
const int maxn = 2e5 + 10;
struct node{
    int a, b, c, d, e;
    string name;
    double tol;
} in[maxn];
bool cmp(const node &a, const node &b) {
    if (fabs(a.tol - b.tol) < 0.000001) return a.name < b.name;
    else return a.tol > b.tol;
}
  
int main() {
    int n;
    while (~scanf("%d", &n)) {
        int ma = 0, mb = 0, mc = 0, md = 0, me = 0;
        for (int i = 0; i < n; i++) {
            cin >> in[i].name;
            scanf(" %d %d %d %d %d", &in[i].a, &in[i].b, &in[i].c, &in[i].d, &in[i].e);
            ma = max(ma, in[i].a);
            mb = max(mb, in[i].b);
            mc = max(mc, in[i].c);
            md = max(md, in[i].d);
            me = max(me, in[i].e);
        }
        for (int i = 0; i < n; i++) {
            in[i].tol = (double)in[i].a * 600 * 0.25 / ma + ((double)in[i].b * 300 / mb + (double)in[i].c * 300 / mc) * 0.25 + ((double)in[i].d * 300 / md + (double)in[i].e * 300 / me) * 0.5;
        }
        sort(in, in + n, cmp);
        for (int i = 0; i < n; i++) { cout << in[i].name << ' '; printf("%.5f\n", in[i].tol); }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章