您的位置:首页 > 编程语言 > C语言/C++

July 16th 模拟赛C T1 竞赛排名 Solution

2016-07-16 12:16 543 查看
空降题目处

点我点我点我

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的选手的编号。

Solution

Σ:sigma求和符号。

按题意解即可,数据范围为1≤N≤(坑)

Program

C++

#include<iostream>
#include<fstream>
#include<cstdio>
#include<cmath>
using namespace std;

int n,x[1001][9],num[1001],sumx[1001];
double t[9],avg[9],y[1001][9],sumy[1001];

void sort(int l,int r);

int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=8;j++)
{
scanf("%d",&x[i][j]);
avg[j]+=(double)(x[i][j]);
sumx[i]+=x[i][j];
}
for (int j=1;j<=8;j++)
avg[j]=avg[j]/(double)(n);
for (int j=1;j<=8;j++)
{
for (int i=1;i<=n;i++)
{
t[j]+=abs(x[i][j]-avg[j]);
num[i]=i;
}
t[j]=t[j]/n;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=8;j++)
{
if (t[j]==0)
y[i][j]=0;
else
y[i][j]=(x[i][j]-avg[j])/t[j];
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=8;j++)
if (j<4)
sumy[i]+=y[i][j];
else
sumy[i]+=y[i][j]*0.8;
}
sort(1,n);
for (int i=1;i<=n;i++)
printf("%d\n",num[i]);
}

void sort(int l,int r)
{
int i=l,j=r,m3=num[(l+r)/2],m2=sumx[(l+r)/2];
double m1=sumy[(l+r)/2];
do
{
while ((sumy[i]>m1)||((sumy[i]==m1)&&(sumx[i]>m2))||((sumy[i]==m1)&&(sumx[i]==m2)&&(num[i]<m3)))
i++;
while ((sumy[j]<m1)||((sumy[j]==m1)&&(sumx[j]<m2))||((sumy[j]==m1)&&(sumx[j]==m2)&&(num[j]>m3)))
j--;
if (i<=j)
{
swap(sumy[i],sumy[j]);
swap(sumx[i],sumx[j]);
swap(num[i],num[j]);
i++;
j--;
}
}
while (i<=j);
if (i<r)
sort(i,r);
if (l<j)
sort(l,j);
}


Pascal

uses
math;

var
i,j,n:longint;
x:array [0..1000,0..8] of longint;
y:array [0..1000,0..8] of double;
num,sumx:array [0..1000] of longint;
sumy:array [0..1000] of double;
t,avg:array [0..8] of double;

procedure swap(var x,y:longint);
var
t:longint;

begin

t:=x;
x:=y;
y:=t;

end;

procedure swap(var x,y:double);
var
t:double;

begin

t:=x;
x:=y;
y:=t;

end;

procedure sort(l,r:longint);
var
m1:double;
i,j,m2,m3:longint;

begin

i:=l;
j:=r;
m1:=sumy[(l+r) div 2];
m2:=sumx[(l+r) div 2];
m3:=num[(l+r) div 2];
repeat
while ((sumy[i]>m1) or ((sumy[i]=m1) and (sumx[i]>m2)) or ((sumy[i]=m1) and (sumx[i]=m2) and (num[i]<m3))) do
inc(i);
while ((sumy[j]<m1) or ((sumy[j]=m1) and (sumx[j]<m2)) or ((sumy[j]=m1) and (sumx[j]=m2) and (num[j]>m3))) do
dec(j);
if i<=j then
begin
swap(sumy[i],sumy[j]);
swap(sumx[i],sumx[j]);
swap(num[i],num[j]);
inc(i);
dec(j);
end;
until i>j;
if i<r then
sort(i,r);
if l<j then
sort(l,j);

end;

begin

readln(n);
for i:=1 to n do
for j:=1 to 8 do
begin
read(x[i][j]);
avg[j]:=avg[j]+x[i][j];
sumx[i]:=sumx[i]+x[i][j];
end;
for j:=1 to 8 do
avg[j]:=avg[j]/n;
for j:=1 to 8 do
begin
for i:=1 to n do
begin
t[j]:=t[j]+abs(x[i][j]-avg[j]);
num[i]:=i;
end;
t[j]:=t[j]/n;
end;
for i:=1 to n do
for j:=1 to 8 do
begin
if t[j]=0 then
y[i][j]:=0
else
y[i][j]:=(x[i][j]-avg[j])/t[j];
end;
for i:=1 to n do
begin
for j:=1 to 8 do
if j<4 then
sumy[i]:=sumy[i]+y[i][j]
else
sumy[i]:=sumy[i]+y[i][j]*0.8;
end;
sort(1,n);
for i:=1 to n do
writeln(num[i]);

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Pascal C++ JZOJ