July 16th 模拟赛C T1 竞赛排名 Solution
2016-07-16 12:16
543 查看
空降题目处
点我点我点我
![](http://img.blog.csdn.net/20160716120836914)
按题意解即可,数据范围为1≤N≤(坑)
Pascal
点我点我点我
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.
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解