首页 > 其他分享 >L2-015 互评成绩

L2-015 互评成绩

时间:2024-12-01 18:04:02浏览次数:8  
标签:min int max 复杂度 互评 num L2 015 sum

目录

一、问题描述

二、问题分析 

三、源码解答

四、时空复杂度分析

五、参考资料


一、问题描述

学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。

1. 输入格式

输入第一行给出3个正整数N(3 < N10^4,学生总数)、k(3 ≤ k ≤ 10,每份作业的评审数)、M(≤ 20,需要输出的学生数)。随后N行,每行给出一份作业得到的k个评审成绩(在区间[0, 100]内),其间以空格分隔。

2. 输出格式

按非递减顺序输出最后得分最高的M个成绩,保留小数点后3位。分数间有1个空格,行首尾不得有多余空格。

3. 输入样例

6 5 3
88 90 85 99 60
67 60 80 76 70
90 93 96 99 99
78 65 77 70 72
88 88 88 88 88
55 55 55 55 55

4. 输出样例

87.667 88.000 96.000

5. 限制条件

代码长度限制        16 KB

时间限制                300 ms

内存限制                64 MB

栈限制                    8192 KB


二、问题分析 

1. 数据结构选择:本题的最大数据已经给定,因此既可以定义一个数组又可以使用vector,因最后要求保留三位小数,因此数据类型选择高精度的double类型。

2. 去掉最大值和最小值:将最小值min_num初始化上限值100,将最大值max_num初始化下限值0,输入数据的同时比较最值,同时使用sum进行求和,最后用sum - max_num - min_num再取平均值。

3. 排序算法的选择:题目限制时间为300ms,最大数据N为10^4,如果对所有数据进行排序,使用sort排序,时间复杂度为O(nlogn),经验证,不会超时。

        但是有没有时间复杂度更小的选择呢?也是有的,因为题目只输出top-k个最高成绩,因此我们可以用小根堆q【优先队列】,该队列只维护k个元素,并且小值在顶。遇到一个新的成绩g:

        if(q.size() < k)   q.push(g);  

        else if(q.top()<g) 移除q.top(), q.push(g)

        else不做任何操作。

        这样就能保持q中top-k元素为最大,并且每次压入或者移除的时间复杂度均为logk,最坏情况下每次都需要更改顶部值,时间复杂度即为O(nlogk),而题目中k << n,可以 一定程度上节省时间。

三、源码解答

1. 使用sort直接排序

#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define debug(a) cout << "Line " << __LINE__ << ":  " << #a << " = " << a << endl
#define FLOAT_FIXED(n) cout << setiosflags(ios::fixed) << setprecision(n)
int main() {
    IOS;
    //大的沉底
    vector<double>v;
    int n, m, k;
    cin >> n >> m >> k;
    int num;
    while(n--) {
        int sum = 0, min_num = 100, max_num = 0;
        for(int i = 1; i <= m; ++i) {
            cin >> num;
            if(num < min_num) min_num = num;
            if(num > max_num) max_num = num;
            sum += num;
        }
        double score = (sum - max_num - min_num) * 1.0 / (m - 2);
        v.push_back(score);
    }
    FLOAT_FIXED(3);
    sort(v.begin(), v.end(), greater<double>());
    for(int i = k - 1; i >= 0; --i) {
        cout << v[i];
        if(i) cout << " ";
    }
    return 0;
}

2. 使用优先队列

#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define debug(a) cout << "Line " << __LINE__ << ":  " << #a << " = " << a << endl
#define FLOAT_FIXED(n) cout << setiosflags(ios::fixed) << setprecision(n)
int main() {
    IOS;
    //大的沉底
    priority_queue<double, vector<double>, greater<double>>pq;
    // vector<double>v;
    int n, m, k;
    cin >> n >> m >> k;
    int num;
    while(n--) {
        int sum = 0, min_num = 100, max_num = 0;
        for(int i = 1; i <= m; ++i) {
            cin >> num;
            if(num < min_num) min_num = num;
            if(num > max_num) max_num = num;
            sum += num;
        }
        double score = (sum - max_num - min_num) * 1.0 / (m - 2);
        // v.push_back(score);
        if(pq.size() < k) pq.push(score);
        else if(pq.top() < score) {
            pq.pop();
            pq.push(score);
        }
    }
    FLOAT_FIXED(3);
    // sort(v.begin(), v.end(), greater<double>());
    // for(int i = k - 1; i >= 0; --i) {
    //     cout << v[i];
    //     if(i) cout << " ";
    // }
    while(true) {
        cout << pq.top();
        pq.pop();
        if(pq.empty()) break;
        else cout << " ";
    }
    return 0;
}

四、时空复杂度分析

1. 时间复杂度

- sort排序:O(nlogn)

PTA运行效果:

- 优先队列:O(nlogk)

PTA运行效果:

2. 空间复杂度

- sort排序:不考虑排序带来的开销,空间复杂度即为数组大小,为O(n).

优先队列:不考虑其他开销,空间复杂度为O(k).

五、参考资料

PTA | 程序设计类实验辅助教学平台

标签:min,int,max,复杂度,互评,num,L2,015,sum
From: https://blog.csdn.net/weixin_65214650/article/details/144151054

相关文章

  • IDA+WSL2实现本地linux动态调试
    1、首先在ida安装目录找到dbgsrv这个文件夹,打开后把“linux_server”这个文件拖到你的linux中(我放在/root位置)2、然后赋予两个文件权限(linux-server和要调试的文件)chmod+x/root/linux_serverchmod+x你的待调试文件位置然后运行调试组件/root/linux_server64参数:“-p......
  • 书生浦语大模型实战训练营L2G3000 LMDeploy 量化部署实践闯关任务
    LMDeploy量化部署实践闯关任务文章目录LMDeploy量化部署实践闯关任务前言一、任务一W4A16量化+KVcache+KVcache量化二、任务二前言使用结合W4A16量化与kvcache量化的internlm2_5-1_8b-chat模型封装本地API并与大模型进行一次对话。使用Functioncall功能......
  • 【机器学习】L1与L2正则化的深度解读:如何平衡模型复杂度与性能
    L1与L2正则化的深度解读:如何平衡模型复杂度与性能1.引言:过拟合问题1.1什么是过拟合?1.2为什么会出现过拟合?主要原因:1.3正则化的基本思想2.L1正则化深度解析2.1数学表达式2.2L1正则化的特性1.稀疏解的产生2.优化特性3.权重更新规则3.L2正则化深度解析3.1数......
  • P5015 [NOIP2018 普及组] 标题统计 C语言
    先说思路:跟着题意来就好,其实更多的是考察fgets()函数的基础运用,之后用循环遍历字符串,若是遇到空格和换行符就不计入,反之count++;这里也可以直接用isalnum()直接对输入的字符是否是字母或是数字进行判断。以下是代码实现:#include<stdio.h>#include<ctype.h>intmain(){......
  • 软件设计-Tutorial25
    类图:```mermaidclassDiagramclassItem{<<interface>>+accept(Visitorvisitor)}classBook{-Stringtitle+getTitle()+accept(Visitorvisitor)}classElectronic{-String......
  • 02-SDL2使用(一)
    1.新建一个窗体并添加事件监听与响应SDL_Init(),首先是按照需求对SDL相关子系统进行初始化,在程序最后退出之前需要使用SDL_Quit()清理所有初始化的子系统。SDL_CreateWindow()创建一个窗体,SDL_DestroyWindow()销毁窗体。SDL_Event定于一个事件,SDL_PollEvent()当前挂起事件的轮......
  • 软件设计-Tutorial23
    类图:classDiagramclassTravelContext{-TravelStrategystrategy+setTravelStrategy(TravelStrategy)+executeTravel()}classTravelStrategy{<<interface>>+travel()}classAir......
  • 0015 判断输入的数是不是素数-控制台程序-极语言教程
    小程序初始启动写格式("请输入大于1并且小于等于2147483647的正整数进行素数判断:\r\n")循环{整数输入数,计数,判断数=1,开始时间=0,结束时间=0,需要时间=0读格式("%d",&输入数)开始时间=开机毫秒循环于(计数=2;计数<输入数;计数++){......
  • proftpd 远程代码执行 (CVE-2015-3306)
            漏洞描述:ProFTPD是ProFTPD团队的一套开源的FTP服务器软件。该软件具有可配置性强、安全、稳定等特点。ProFTPD1.3.5中的mod_copy模块允许远程攻击者通过站点cpfr和sitecpto命令读取和写入任意文件。任何未经身份验证的客户端都可以利用这些命令将文件从文......
  • [HAOI2015] 树上染色
    题目链接树形DP简要题意\(n\)个点的树,其中\(k\)个点染黑色,\(n-k\)个点染白色,求黑点两两距离之和加白点两两之和的最大值。思路我们首先考虑如果\(k=0\)时,答案应该怎么算,此时显然是\(\sum_{i=1}^n\sum_{j=i+1}^ndis(i,j)\)。然后我们考虑如何在\(O(n)\)的时间复杂度......