题解:P11950 [科大国创杯初中组 2023] 评分

· · 题解

题目传送门

前置知识:排序、结构体。

首先结构体中需要编号 id、分数 answer,设这个结构体数组为 ans,例如访问数组的编号为 ans_{i,id}

接着输入 n,m,使用循坏遍历 1\sim n,让 ans_{i,id}=i,定义两个变量 mina=101,maxa=-1 用于计算最大最小值。接着输入分数 a_{i,j},并求出最大最小值 mina=\min(a_{i,j},mina),maxa=\max(a_{i,j},maxa) 和求出总和。然后让总和 -mina-maxa 再除以 m-2,这是平均分,也就是 ans_{i,answer}

然后按 answer 的高低排序,高得在前;相同时 id 按大小排序,小在前。

最后输出。

代码:

复杂度:O(n^2+n \log n)

#include<bits/stdc++.h>
using namespace std;
const int maxn=101;
int n,m;
int a[maxn][maxn];
struct node{
    double answer;
    int id;
}ans[maxn];
bool cmp(node x,node y){
    return x.answer==y.answer?x.id<y.id:x.answer>y.answer;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        ans[i].id=i;
        int mina=101,maxa=-1;
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            mina=min(a[i][j],mina);
            maxa=max(a[i][j],maxa);
            ans[i].answer+=a[i][j];
        }
        ans[i].answer=(ans[i].answer-mina-maxa)/(m-2);
    }
    sort(ans+1,ans+n+1,cmp);
    for(int i=1;i<=n;i++){
        cout<<ans[i].id<<" ";
    }
    return 0;
}
/*
4 4
4 70 69 34
18 43 85 71
100 50 69 80
67 82 90 43
*/