竞赛排名


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

Output

  输出文件为compe.out。文件有N行,从第一行到第N行依次为排名第1的选手的编号,排名第2的选手的编号,。。。,排名第N的选手的编号。

SampleInput

3

72 8273 68 95 86 82 90

72 9050 60 80 70 65 80

72 8273 68 95 86 82 90

SampleOutput

1

3

2

 

直接用上面的公式计算。一开始直接WA了,还0分。后来才知道,快排不稳定啊,就说为什么反过来。又把一个4打错成了1,下面可以看到的,真是不爽。顺便吐槽一下,叶文韬又用不正当手段AK了。我F8了半个小时才A了。

 

var

 a:Array [1..1000,1..8] of longint;

 avg,sumy:Array[1..1000] of real;

 y:Array [1..1000,1..8] of real;

 sum,h:Array [1..1000] of longint;

 n,i,j,k,t:longint;

 num:real;

begin

 readln(n);

 for i:=1 to n do

  for j:=1 to 8 do

   read(a[i,j]);

 for i:=1 to 8 do

 begin

  for j:=1 to n do

  avg[i]:=avg[i]+a[j,i];

 avg[i]:=avg[i]/n;

 end;

 

fori:=1 to n do

begin

 for j:=1 to 8 do

  sum[i]:=sum[i]+a[i,j];

 h[i]:=i;

end;

fori:=1 to n do

 for j:=1 to 8 do

  begin

   num:=0;

   for k:=1 to n do

    num:=num+abs(a[k,j]-avg[j]);

   if num=0 then y[i,j]:=0

            else y[i,j]:=(a[i,j]-avg[j])*n/num;

  end;

 

 for i:=1 to n do

  begin

   for k:=1 to 3 do

    sumy[i]:=sumy[i]+y[i,k];

   for k:=4 to 8 do

    sumy[i]:=sumy[i]+y[i,k]*0.8;

  end;

 

 for i:=1 to n-1 do

  for j:=i+1 to n do

   begin

    if (sumy[i]<sumy[j]) or (sumy[i]=sumy[j]) and(sum[i]<sum[j]) or

       (sumy[i]=sumy[j]) and(sum[i]=sum[j]) and (h[i]>h[j]) then

        begin

         num:=sumy[i];sumy[i]:=sumy[j];sumy[j]:=num;

         t:=sum[i]; sum[i]:=sum[j]; sum[j]:=t;

         t:=h[i]; h[i]:=h[j]; h[j]:=t;

        end;

   end;

 

  for i:=1 to n do

   writeln(h[i]);

end.

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值