1 条题解

  • 0
    @ 2025-8-24 23:11:35

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar niuniudundun
    天禄

    搬运于2025-08-24 23:11:35,当前版本为作者最后更新于2025-03-21 21:33:02,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目传送门

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

    首先结构体中需要编号 idid、分数 answeranswer,设这个结构体数组为 ansans,例如访问数组的编号为 ansi,idans_{i,id}

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

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

    最后输出。

    代码:

    复杂度:O(n2+nlogn)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
    */
    
    • 1

    信息

    ID
    11745
    时间
    1000ms
    内存
    1024MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者