1 条题解
-
0
自动搬运
来自洛谷,原作者为

HanPi
搬运于
2025-08-24 22:14:07,当前版本为作者最后更新于2020-11-24 23:31:21,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
以极其暴力的模拟过了此题解释一下这些符号
-
绝对值和 分数应该没有人不懂吧...
-
: 求 的和,可以看成是
for(i=1;i<N;++i)sum+=x[i][j] -
$y_{ij}=\begin{cases}0&\sum_{i=1}^N|x_{ij}-avg_J|=0\\\frac{x_{ij}-avg_j}{\frac{1}{N}\sum_{i=1}^N|x_{ij}-avg_j|}&\sum_{i=1}^N|x_{ij}-avg_J|\ne0\end{cases}$
当 的值为零时 的值为 . 当 的值不为零时 的值为 $\frac{x_{ij}-avg_j}{\sum_{i=1}^N|x_{ij}-avg_J|\div N}$
用人话来讲就是 用 ( 与 第 科平均分相差的分数) 去除以 ( 每一科的分数与平均分的差的平均值)
-
前三科成绩的位置分直接加,后四科要 再相加.
(语数英?)
读懂题目模拟就比较好打了.
另外注意double类型的等于判断.
#include <stdio.h> #include <stdlib.h> const double dis=1e-6; typedef struct _Student { int ind; int mark[9]; int allMark; double y[9]; double sumy; }Stu; Stu a[10086]; int cmp(const void* a,const void* b) { Stu* pa=a; Stu* pb=b; double tmp=pa->sumy-pb->sumy; tmp=tmp>0?tmp:-tmp; /*奇妙的判断,省略了else*/ if(tmp>dis)return pa->sumy<pb->sumy?1:-1; if(pa->allMark!=pb->allMark)return pa->allMark<pb->allMark?1:-1; return pa->ind-pb->ind; } int n; int sumJMark[11]; double avg[11]; double tmp; double cha; int main() { int i,j,k; scanf("%d",&n); for(i=0;i<n;++i) { a[i].ind=i; for(j=0;j<8;++j) { scanf("%d",&a[i].mark[j]); a[i].allMark+=a[i].mark[j]; sumJMark[j]+=a[i].mark[j]; } } for(i=0;i<8;++i) { avg[i]=((double)sumJMark[i])/((double)n); } for(j=0;j<8;++j) { for(i=0;i<n;++i) { cha=0; for(k=0;k<n;++k) { tmp=a[k].mark[j]-avg[j]; cha+=(tmp>0)?tmp:-tmp; } cha/=n; if(cha)a[i].y[j]=(a[i].mark[j]-avg[j])/cha; } } for(k = 0; k < 3; ++k)a[i].sumy+=a[i].y[k]; for(k = 3; k < 8; ++k)a[i].sumy+=0.8*a[i].y[k]; qsort(a,n,sizeof(Stu),cmp); for(i=0;i<n;++i)printf("%d\n",a[i].ind+1); return 0; } -
- 1
信息
- ID
- 4770
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者