7.16第一题“竞赛排名”

Description

 

Input

  输入文件为compe.in。文件的第一行为参赛总人数N(1<=N<=100),从第二行到第N行依次为编号1到编号N的选手的成绩,每行有8个0~100之间的整数,代表该选手的8项竞赛成绩xi1,xi2,。。。,xi8。同一行相邻两个数之间用一个空格符隔开。

Output

  输出文件为compe.out。文件有N行,从第

一行到第N行依次为排名第1的选手的编号,排名第2的选手的编号……排名第N的选手的编号。


题解

直接模拟,注意n<=1000。
var
        i,j,n,k:longint;
        sum,avg,x,y:array[0..1000]of double;
        f,p:array[0..1000,0..8]of double;
        a:array[0..1000]of integer;
        tot,l:real;
begin
        assign(input,'compe.in');reset(input);
        read(n);
        for i:=1to n do
        begin
                a[i]:=i;
                for j:=1to 8do
                begin
                        read(f[i,j]);
                        sum[i]:=sum[i]+f[i,j];
                        avg[j]:=avg[j]+f[i,j];
                end;
        end;
        for j:=1to 8do
                avg[j]:=avg[j]/n;
        for i:=1to n do
                for j:=1to 8 do
                begin   tot:=0;
                        for k:=n downto 1do
                                tot:=tot+abs(f[k,j]-avg[j]);
                        if tot<>0then
                                p[i,j]:=(f[i,j]-avg[j])/tot*n;
                end;
        for i:=1to n do
        begin
                for j:=1to 3do
                        y[i]:=y[i]+p[i,j];
                for j:=4to 8do
                        y[i]:=y[i]+0.8*p[i,j];
        end;
        for i:=1to n-1 do
                for j:=i+1 to n do
                begin
                        if(y[i]a[j]))then
                        begin
                                y[0]:=y[i];y[i]:=y[j];y[j]:=y[0];
                                sum[0]:=sum[i];sum[i]:=sum[j];sum[j]:=sum[0];
                                a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
                        end;
                end;
        for i:=1to n do
                writeln(a[i]);
end.


你可能感兴趣的:(7.16第一题“竞赛排名”)