首页 > 编程语言 >7-9 期末编程作业计分规则

7-9 期末编程作业计分规则

时间:2024-08-27 20:52:27浏览次数:5  
标签:计分 int 编程 期末 tierSizes 100 numStudents 94 输入

期末编程作业计分规则。

PTA上的题目集的排名页以总分(满分不一定是100分)的形式按排名顺序显示每个同学的成绩,但相同分数的同学无论排名是靠前还是最后得分都是一样的。为了表示排名区分度,根据排名给出了一个简单的计分规则,以示有所区分。计分规则如下:

成绩折合成100分(取整),然后将班级人数按输入的百分比分成四个个档(如前三档人数的百分比分别为10%、40%、40%,则输入10、40 、40,各档人数均向上取整,剩下的则为最后一档人数),给出一个减分序列,每档所要减去的分数为减分序列中对应的位置及之前的值的总和。

如一个班级有10个同学,若得分都是100分,减分序列为1、3、2、2,若按10%、40%、40%的人数比例的排名分别减去1分、4分、6分、8分。这样每个同学最后的总分得分依次为:100、96、96、96、96、94、94、94、94、92。

要求编程实现根据上述计分规则计算后的成绩得分,按原排名先后输出每个同学的百分制最后得分。

输入格式:

输入四行,第一行输入班级人数和满分分数,第二行按排名顺序输入每个同学的分数,第三行输入各档分数的人数百分比(三项),第四行输入减分序列。

输出格式:

输出根据计分规则计算后的百分制得分,两个成绩之间以两个空格隔开

注意:最后一个数后面有两个空格

输入样例1:

在这里给出一组输入。例如:

10 100
100 100 100 100 100 100 100 100 100 100
10 40 40
1 3 2 2

输出样例1:

在这里给出相应的输出。例如:

99  96  96  96  96  94  94  94  94  92  

输入样例2:

在这里给出一组输入。例如:

7 120
110 95 95 92 92 92 88
10 20 40
0 1 1 1

输出样例2:

在这里给出相应的输出。例如:

91  78  78  74  74  74  70  
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 输入班级人数和满分分数
        int numStudents = scanner.nextInt();
        int fullScore = scanner.nextInt();

        // 输入每个同学的分数
        int[] scores = new int[numStudents];
        for (int i = 0; i < numStudents; i++) {
            scores[i] = scanner.nextInt();
        }

        // 输入各档分数的人数百分比
        int[] percentage = new int[3];
        for (int i = 0; i < 3; i++) {
            percentage[i] = scanner.nextInt();
        }

        // 输入减分序列
        int[] deduction = new int[4];
        for (int i = 0; i < 4; i++) {
            deduction[i] = scanner.nextInt();
        }

        // 计算每个同学的最终得分
        int[] finalScores = calculateFinalScores(numStudents, fullScore, scores, percentage, deduction);

        // 输出最终得分
        for (int i = 0; i < numStudents; i++) {
            System.out.print(finalScores[i] + "  ");
        }
        System.out.println();
    }

    // 计算每个同学的最终得分
    private static int[] calculateFinalScores(int numStudents, int fullScore, int[] scores, int[] percentage, int[] deduction) {
        int[] finalScores = new int[numStudents];

        // 将成绩折合成100分
        for (int i = 0; i < numStudents; i++) {
            finalScores[i] = (int) Math.round(((double) scores[i] / fullScore) * 100);
        }

        // 计算各档人数
        int[] tierSizes = calculateTierSizes(numStudents, percentage);

        // 计算每个同学的减分
        int currentDeduction = 0;
        int tierIndex = 0;
        int currentTierSize = tierSizes[tierIndex];
        for (int i = 0; i < numStudents; i++) {
            if (i < currentTierSize) {
                finalScores[i] -= currentDeduction;
            } else {
                tierIndex++;
                currentTierSize += tierSizes[tierIndex];
                currentDeduction += deduction[tierIndex];
                finalScores[i] -= currentDeduction;
            }
        }

        return finalScores;
    }

    // 计算各档人数
    private static int[] calculateTierSizes(int numStudents, int[] percentage) {
        int[] tierSizes = new int[4];
        int remainingStudents = numStudents;
        for (int i = 0; i < 3; i++) {
            tierSizes[i] = (int) Math.ceil(((double) percentage[i] / 100) * numStudents);
            remainingStudents -= tierSizes[i];
        }
        tierSizes[3] = remainingStudents;
        return tierSizes;
    }
}

 

标签:计分,int,编程,期末,tierSizes,100,numStudents,94,输入
From: https://blog.csdn.net/GZH_mxjx/article/details/141612310

相关文章

  • GUI编程02:Panel面板讲解
    本节内容视频链接:4、Panel面板讲解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p=4&vd_source=b5775c3a4ea16a5306db9c7c1c1486b5在窗口(frame)中添加面板(panel), 并解决了窗口关闭事件。packagecom.yundait.www;importjava.awt.*;importjava.awt.e......
  • 编程之路:如何在挫折中寻找突破的光芒
                    编程是一条充满挑战和机遇的道路。对于初学者来说,这条路上布满了令人沮丧的错误和复杂的算法,仿佛一道道难以逾越的高墙。然而,每一位编程高手都曾经历过这些挫折,并最终找到了突破的方法。在这篇文章中,我们将探讨如何在Bug的迷宫中找到出口,以......
  • [编程笔记] 较严重事故,产品安装后登录不上!
    周一打开工单列表,便看到这个问题了,“登录报验证码错误,刷新依旧”。由于周一太忙,拖到今天才有空远程核实,首先说下大致情况:1、安装后产生的问题,登录不了,客户自己重启过IIS和电脑2、产品验证码存在Redis里,一般是这里的服务器没启动或者异常停止会报这个错,......
  • Vue编程式导航
    编程式导航和上面说的声明式导航的区别在于,声明式导航是先写好便签,然后进行导航。编程式导航通过代码直接进行了导航。通过this.$router.push()这个方法来实现编程式导航,当然也可以实现参数传递,这种编程式导航一般是用于按钮点击之后跳转。<!DOCTYPEhtml><htmllang="en"......
  • 【编程规范具体案例(基于Qt、微软、谷歌和AUTOSAR C++14 参考)】 C++ 编码规范 之并发篇
    目录标题并发目录12.并发编程规范12.1线程创建与管理规则12.1.1\[必须]明确定义线程的生命周期管理策略12.1.2\[必须]为关键线程设置明确的标识符12.1.3\[必须]在多线程环境中安全地处理异常12.2线程同步规则12.2.1\[必须]使用线程安......
  • STL与泛型编程
    1.迭代器种类(1)inputiterator(2)outputiterator(3)forwarditerator(4)bidirectionaliterator(5)randomaccessiterator2.inputiterator信息从容器流入程序被称为输入,input迭代器被用于从容器中读取信息。Input迭代器只读,不能改写容器中的数据。input迭代器支持++操......
  • laravel11+vue编程
    文档视频地址https://www.youtube.com/watch?v=iGnlmxA7oM8&list=PL38wFHH4qYZXCW2rlBLNdHi5cv-v_qlXO视频代码https://github.com/JonVadar/YouTube_videos/tree/main/Webdeveloperpathvideos/laravel_Inertia_VueCSSfile:https://github.com/JonVadar/YouTube_videos......
  • 【JUC并发编程系列】深入理解Java并发机制:CAS算法与原子类在Java中的实践应用(二、CAS
    文章目录【JUC并发编程系列】深入理解Java并发机制:CAS算法与原子类在Java中的实践应用(二、CAS)1.同步之原子类(Atomic类)2.使用atomicInteger计数3.使用atomicInteger底层原理3.compareAndSet原理分析3.1手写AtomicInteger3.2手写Lock锁3.3CASaba的问题3.4Atomic......
  • 【JUC并发编程系列】深入理解Java并发机制:从用户态到内核态的探索(一、前置知识)
    文章目录【JUC并发编程系列】深入理解Java并发机制:从用户态到内核态的探索(一、前置知识)1.用户态与内核态区别2.线程安全同步的方式3.传统锁有哪些缺点4.发生CPU上下文切换的原因5.如何避免上下文切换6.详细总结6.1用户态与内核态6.2线程安全同步方式6.3传统锁的......
  • 【python计算机视觉编程——1.基本的图像操作和处理】
    python计算机视觉编程——1.基本的图像操作和处理1.基本的图像操作和处理1.1PIL:Python图像处理类库1.1.1转换图像格式1.1.2创建缩略图1.1.3复制和粘贴图像区域1.1.4调整尺寸和旋转1.2Matplotlib1.2.1绘制图像、点和线1.2.2图像轮廓和直方图1.3Numpy1.3.1图像......