P5759 题解

shaoziqi

2022-01-23 12:02:01

Solution

$$这道题重在理解题意$$ 选手编号依次为: $1,2...N$ ( $N$ 为参赛总人数)。 设 $x_{ij}$ 分别表示编号为 $i$ 的选手第 $j$ 项竞赛的成绩 $(1 \le i \le N$,$1 \le j \le 8)$ 。其它指标如下: - 第 $j$ 项竞赛的平均分 $ avg_j = \frac{1}{N} \sum_{i=1}^N x_{ij} $,($1 \le j \le 8)$。 - 选手 $i$ 的总分 $sumx_i = \sum_{j=1}^8 x_{ij}$,($1 \le i \le N$)。 - 选手 $i$ 第 $j$ 项竞赛的位置分 ```cpp zm[j][i]+=abs(zn[k][i]-f[i]); zm[j][i]=(zn[j][i]-f[i])/(zm[j][i]/n); a[i].zf+=zm[i][j]; a[i].zf+=double(0.8*zm[i][j]); 位置分的计算 ``` - 选手 $i$ 的总位置分 $sumy_i = \sum_{k=1}^3 y_{jk} + 0.8 \sum_{k=4}^8 y_{jk}$,$(1 \le i \le N)$。 ```cpp a[i].sum+=zn[i][j]; 总位置分的计算 ``` 所以,一开始我用暴力DFS跑 ~~突然60分有了(毕竟数据小)~~ 所以可以得出 AC 算法 上代码!!! 其实我也是借鉴了题解区的大佬的算法,非常谔谔 ```cpp #include<bits/stdc++.h> #define LL long long //十年OI一场空,不开long long见祖宗 #define H 101 using namespace std; #ifdef ONLINE_JUDGE static char buf[1000000],*p1=buf,*p2=buf; #define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++ #endif inline int read() //快读 { char ch=getchar(); long long f=1,res=0; while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+ch-48,ch=getchar(); return res*f; } const int N=1e4+1;//其实就是10001 struct Sama{ int id; double zf,sum; }; Sama a[N]; LL n; int zn[N][H]; double zm[N][H],f[H]; bool cmp(Sama a1,Sama a2){//简简单单的排序 if(a1.zf!=a2.zf){ return a1.zf>a2.zf; } else if(a1.sum!=a2.sum){ return a1.sum>a2.sum; } return a1.id<a2.id; } int main(){ ios::sync_with_stdio(false); n=read(); for(int i=1;i<=n;i++){ for(int j=1;j<=8;j++){ zn[i][j]=read(); } } for(int i=1;i<=8;i++){ for(int j=1;j<=n;j++){ f[i]+=zn[j][i]; } f[i]=f[i]/n; } for(int i=1;i<=8;i++){ for(int j=1;j<=n;j++){ for(int k=1;k<=n;k++){ zm[j][i]+=abs(zn[k][i]-f[i]); //计算前缀和 } if(zm[j][i]!=0){ zm[j][i]=(zn[j][i]-f[i])/(zm[j][i]/n); } } } for(int i=1;i<=n;i++){ a[i].id=i; a[i].sum=0; for(int j=1;j<=3;j++){ a[i].zf+=zm[i][j]; } for(int j=4;j<=8;j++){ a[i].zf+=double(0.8*zm[i][j]); } } for(int i=1;i<=n;i++){ for(int j=1;j<=8;j++){ a[i].sum+=zn[i][j]; } } sort(a+1,a+n+1,cmp); //快排 for(int i=1;i<=n;i++){ cout<<a[i].id<<endl; } return 0; } ```