Python算法100例-4.6 歌星大奖赛

news2024/12/27 16:01:59

完整源代码项目地址,关注博主私信'源代码'后可获取

  • 1.问题描述
  • 2.问题分析
  • 3.算法设计
  • 4.确定程序框架
  • 5.完整的程序
  • 6.问题拓展
  • 7.知识点补充

1.问题描述

在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。

2.问题分析

求一组数中的最大值和最小值是Python语言中比较常见的一类问题,这类问题的算法十分简单,定义两个变量max、min分别存储最大值、最小值,利用两个变量与给定的数依次比较的方法求出最大值和最小值。但是要注重在程序中判定最大值和最小值的变量是如何赋值的。

3.算法设计

确定变量初值。变量max和min要分别与每个数进行比较,因此在第一次比较时要用到两变量的初值,那么max和min的初值赋多少合适呢?一般情况可按照下面的方法赋值,最大值max的初值尽量小,最小值min的初值尽量大。对于变量max来说,只有其初值尽可能小的时候,在第一次与给定的数比较时数1才会大于max,才能把数1赋给max,作为变量max的新值;接着与数2比较,若数2>max,同样把数2的值作为新值赋给max,若数2<max,则max中的值保持不变。重复上面的过程直到max与所有的数都比较完,则max中存储的就是最大值。若刚开始max的值就很大,那么在比较过程中,给定的数若都比当前max的值小,经过一轮比较结束时变量max中存储的仍然是最初所赋的初值,那么这样的比较是没有意义的。比较过程如表(以5个数为例进行说明)所示。

在这里插入图片描述

比较完之后max的值为83,正好是所给数中的最大值。对于变量min的比较与赋值过程同上,在最初赋值是为了保证给定的任意一个数都比min小,所以应该把min的初值赋得尽可能大。

对于10个评委的评分利用循环结构实现,循环变量i记录已经输入的评分的个数,初值为0,判定条件为i<10。评分的总和采用累加的方式存储到变量sum中,即循环体执行一次输入一个分数,接着将其累加到变量sum上,等到循环结束时,sum中即为所有评分的总和。求解最大值和最小值的过程与表4.4所示类似,每输入一个分数,就与当前的最大(小)值进行比较,若其大(小)于变量max(min)的值就把此分数赋值给max(min)。由上述过程可以看出,无论是输入分数、求解总和还是寻找最大(小)值,都可以在一个循环过程中实现,代码如下:

for i in range(1, 11):
    print("第%d个评委打分:" %i, end="")
    integer = int(input())                  # 输入评委的评分
    sum += integer                                  # 计算总分
    if integer > max:                    # 通过比较筛选出其中的最高分
        max = integer
    if integer < min:                    # 通过比较筛选出其中的最低分
        min = integer

4.程序框架

程序流程图如图所示。

在这里插入图片描述

5.完整的程序

根据上面的分析,编写程序如下:

# 歌星大奖赛

if __name__ == "__main__":
    max = 0
    min = 100
    sum = 0                                                                 # sum存放10个评委打分的总分数
    for i in range(1, 11):
        print("第%d个评委打分:" %i, end="")
        integer = int(input())                        # 输入评委的评分
        print(integer)
        if integer < 0 or integer > 100:              # 对分数值进行验证
            print("输入的分数错误")
            exit()
        sum += integer                                              # 计算总分
        if integer > max:                                        #通过比较筛选出其中的最高分
            max = integer
        if integer < min:                                        #通过比较筛选出其中的最低分
            min = integer
    print("去掉一个最高分:%d" % max)
    print("去掉一个最低分:%d" % min)
    print("最后得分:%d" % ((sum - max - min) // 8))

第1个评委打分:99
第2个评委打分:98
第3个评委打分:97
第4个评委打分:6
第5个评委打分:94
第6个评委打分:34
第7个评委打分:95
第8个评委打分:92
第9个评委打分:91
第10个评委打分:93
去掉一个最高分:99
去掉一个最低分:6
最后得分:86

6.问题拓展

题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接近平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎样实现?

要找出最公平与最不公平的评委,需要在求出平均值后将该值与所有分数进行比较,求出与平均值差值的绝对值最大和最小的两个评分,该评分所对应的评委即为所求。因有一比较过程,因此在输入完评委的评分后需要将其存储,若在上述代码基础上进行改进,则需要另外定义10个变量来存储评委评分。此算法虽然可以满足题目要求,但是写起来麻烦,为解决这个问题可以利用数组来实现,这样便可不必定义10个变量,只需要定义一个包含10个元素的数组,第1到第10个评委的评分分别存储到数组score[0]~score[10]。

最公平的评委即求出的与平均值差值最小的评分所对应的评委,若有一个评分正好等于平均分,则此分数对应的评委即为最公平的;若都不相同,则需要将差值进行比较选出最小值,算法与求一组数中最小值的思路相同。最不公平的评委一定在所求的最大值和最小值对应的评委中产生。

代码如下:

# 歌星大奖赛

import random

# 求出最大分数值
def maxScore(score):
    max = score[0]                                                          # 给max赋初值
    m = 0                                                                   # m记录最大值的下标
    for j in range(1, 10):
        if max < score[j]:
            max = score[j]
            m = j                                                   # 记录最大值的下标
    print("最大的分数为:%d" % max)
    return max,m

# 求出最小分数值
def minScore(score):
    min = score[0]                                                          # 给min赋初值
    n = 0                                                                   # n记录最小值的下标
    for j in range(1, 10):
        if min > score[j]:
            min = score[j]
            n = j                                                   # 记录最小值的下标
    print("最小的分数为:%d" % min)
    return min,n


if __name__=="__main__":
    sum = 0                                                                 # 记录10个评委打分的总分数
    score = [0]*10
    for i in range(10):
        score[i] = random.randint(0, 101)   # 生成10个随机分数
        sum = sum + score[i]
    print("10个评委的打分为:", score)
    max,m = maxScore(score)
    min,n = minScore(score)

    avg = (sum - max - min) // 8                    # 计算平均分
    print("去掉最高分和最低分,最后得分:%d" %avg)

    temp = 0                        # temp用来记录最公平与最不公平评委给出的评分存储的下标
    s = abs(score[0] - avg)                                 # s记录评分与平均值差值的绝对值
    for i in range(10):
        if abs(score[i] - avg) == 0:
            temp = i
            print("最公平的评委是:%d, 打分:%d" % ((temp + 1),(score[temp+1])))

    temp = 0
    for i in range(10):
        if abs(score[i] - avg) != 0:
            if s > abs(score[i] - avg):
                s = abs(score[i] - avg)
                temp = i
    print("最公平的评委是:%d" %(temp + 1))

    if (avg - min) == (max - avg):
        print("最不公平的评委是:%d %d" %((m+1), (n+1)))
    else:
        if (avg - min) > (max - avg):
            print("最不公平的评委就是:%d" %(n+1))
        else:
            print("最不公平的评委就是:%d" %(m+1))


10个评委的打分为: [86, 74, 34, 95, 11, 3, 95, 60, 61, 88]
最大的分数为:95
最小的分数为:3
去掉最高分和最低分,最后得分:63
最公平的评委是:9
最不公平的评委就是:6

7.知识点补充

random()是随机数库函数,它返回随机生成的一个实数,其值在[0,1)范围内。

random()函数是不能直接访问的,访问它需要导入random模块,然后通过random静态对象调用该方法。

使用如下语句导入random模块:

import random

在程序中导入random模块后,就可以通过random静态对象来调用random模块提供的随机函数了。

下面介绍random模块提供的常用随机函数。

·random.random():该函数生成一个0到1之间的随机小数。

·random.randint():该函数具有两个参数,一个是范围上限,一个是范围下限,用于随机生成指定范围内的整数,其中下限必须小于上限。

·random.uniform():该函数具有两个参数,一个是范围上限,一个是范围下限,用于随机生成指定范围内的浮点数(小数),其中下限必须小于上限。

·random.randrange():该函数具有三个参数,前面两个参数表示范围的上限和下限,第三个参数是一个递增值,用于生成指定范围内,以指定基数递增的随机数。

·random.choice():该函数用于从给定的序列中随机获取一个元素返回。序列可以是字符串、列表、元组等。

·random.shuffle():该函数用于将一个给定的列表元素打乱,随机排序。

·random.sample():该函数具有两个参数,第一个参数表示指定序列,第二个参数是需获取的指定长度,用于从指定序列中随机获取指定长度的片段,原有的序列不会改变。序列可以是字符串、列表、元组等。

代码实例如下:

# random函数

import random

if __name__ == "__main__":
    # 生成一个0到1之间的随机小数,赋值给a
    a = random.random()
    print("a = ", a)

    # 生成一个[0,101)之间的随机整数,赋值给b
    b = random.randint(0, 101)
    print("b = ", b)

    # 生成一个[0,10)之间的随机小数,赋值给c
    c = random.uniform(0, 10)
    print("c = ", c)

    # 随机生成[0, 101)之间的偶数,递增数为2
    d = random.randrange(0, 101, 2)
    print("d = ", d)

    # 随机生成一个字符
    e = random.choice('abcdefg&#%^*f')
    print("e = ", e)

    # 随机返回一个字符串
    f = random.choice(['apple', 'pear', 'peach', 'orange', 'lemon'])
    print("f = ", f)

    #  从给定的多个字符中,随机生成3个字符
    g = random.sample('abcdefghijklmnopqrstuvwxyz',3)
    print("g = ", g)

    # 将一个列表中的元素打乱,随机排序
    num = [9, 6, 4, 0, 2, 5, 3, 7, 1, 8]
    num1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    random.shuffle(num)
    print("num = ", num)

    random.shuffle(num1)
    print("num1 = ", num1)


a =  0.5761180882798892
b =  96
c =  8.111252459197054
d =  26
e =  e
f =  apple
g =  ['d', 'a', 'j']
num =  [4, 3, 1, 2, 5, 8, 0, 7, 9, 6]
num1 =  [7, 1, 6, 3, 2, 8, 10, 5, 4, 9]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1549159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

金融投贷通(金融投资+贷款通)项目准备

金融投贷通&#xff08;金融投资贷款通&#xff09;项目准备 专业术语投资专业术语本息专业术语还款专业术语项目介绍三个子系统技术架构核心流程发布借款标投资业务 项目实施测试流程测试步骤 专业术语 投资专业术语 案例&#xff1a;张三借给李四5W&#xff0c;约定期满1年后…

MySQL 高级语句(二)

一、子查询 1.1 相同表子查询 1.2 不同表/多表子查询 1.3 子查询的应用 1.3.1 语法 1.3.2 insert 子查询 1.3.3 update 子查询 1.3.4 delete 子查询 1.4 exists 关键字 1.4.1 true 1.4.2 false 1.5 as别名 二、视图 2.1 视图和表的区别和联系 2.1.1 区别 2.1.2 …

【面试必备】针对一个案例,怎么测试

思考角度 测试用例设计万能公式功能测试&#xff08;最重要&#xff09;界面测试易用性测试性能测试安全性测试兼容性测试容错性测试 常见案例物品类水杯笔 软件类微信发送朋友圈功能 测试用例设计万能公式 在面试中经常会遇到的一类题是&#xff0c;给你一个具体的产品&#…

《Attention Is All You Need》

参考&#xff1a; Attention Is All You Need 论文解读:Attention is All you need Transformer模型中的attention结构作用是什么&#xff1f; 如何最简单、通俗地理解Transformer&#xff1f; Transformer 新型神经网络&#xff0c;基于注意力机制 的 编码器-解码器 的序列处…

数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;数据分析系统化教学&#xff0c;零基础到进阶实战 景天的主页&#xff1a;景天科技苑 文章目录 Streamlit什么是streamli…

国内ip地址推荐,畅享网络新体验!

在数字化时代&#xff0c;IP地址不仅是网络连接的基石&#xff0c;也是互联网产业发展的重要标志。国内作为全球互联网市场的重要参与者&#xff0c;拥有众多IP地址资源。虎观代理小二旨在探索并推荐一些国内IP地址&#xff0c;分析它们的价值所在&#xff0c;并探讨如何更好地…

抖音电商“达人客服”产品上线啦!超多作者邀你一起“321上客服”!

有问题别自己克服&#xff0c;来抖音电商找“达人客服” 当代年轻人购物&#xff0c;正在从机智省变成理智购。越来越多的人在达人直播间购物&#xff0c;看重的不止是优惠力度&#xff0c;还有服务保障。 为了帮助达人更好地服务用户&#xff0c;抖音电商上线了「达人客服」…

BERT模型中句子Tokenize和ID转换的过程

当我们使用BERT或其他类似的预训练语言模型时&#xff0c;将句子转换为token的过程通常涉及以下几个步骤&#xff1a; 初始化Tokenizer&#xff1a;首先&#xff0c;我们需要导入相应的Tokenizer类&#xff0c;并根据需求选择合适的预训练模型进行初始化。 分词&#xff08;To…

IRIS / Chronicles 数据库结构

对于我们用得最多的关系型数据库来说&#xff0c;首先有的是数据库名字&#xff0c;然后是表名字&#xff0c;然后就是字段名&#xff0c;随后就是一条一条的数据。 对于 IRIS 来说&#xff0c;因为是使用的层级数据库&#xff0c;所以上面的定义就不能完全的照搬了&#xff0…

腾讯云4核8G12M带宽配置服务器能支撑多少人访问?并发数测试

腾讯云4核8G服务器价格&#xff1a;轻量4核8G12M优惠价格646元15个月、CVM S5服务器4核8G配置1437元买1年送3个月。腾讯云4核8G服务器支持多少人同时在线&#xff1f;支持30个并发数&#xff0c;可容纳日均1万IP人数访问。腾讯云百科txybk.com整理4核8G服务器支持多少人同时在线…

MySQL的安装(Linux版)

1.所需要的文件 MySQL.zip 2. 卸载自带的Mysql-libs # 查看是否存在 rpm -qa | grep mariadb# 如果存在则执行命令进行卸载 rpm -e --nodeps mariadb-libs3.在/opt目录下创建MySQL目录并上传所需要的安装包 cd /optmkdir MySQL4.按照编号顺序安装&#xff08;压缩包在解压完…

【业界动态】数字孪生到底意味着什么

什么是数字孪生&#xff1f;它可以理解为一种技术&#xff0c;也可以理解为某种生态。数字孪生即指将物理实体映射至虚拟空间&#xff0c;进而协助完成预测、决策等动作。随着互联网的建设与发展&#xff0c;数字孪生在未来又会如何落地&#xff1f; 一、数字孪生到底是什么&am…

【Java程序设计】【C00389】基于(JavaWeb)Springboot的校园疫情防控系统(有论文)

基于&#xff08;JavaWeb&#xff09;Springboot的校园疫情防控系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过…

弹性伸缩 AS

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

JAVA 使用POI实现单元格行合并

POI实现单元格行合并 实现效果引入jar代码实现controller层Service层ServiceImpl层实现类 实现效果 如果最后面的三行数据大于1时 那么前面十二行就需要行合并 引入jar <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</arti…

java多线程基本操作方法

目录 一、isAlive&#xff08;&#xff09; 二、 join&#xff08;&#xff09; 三、start和run 四、 volatile() 五、synchronized 1、synchronized 引入 2、死锁 第一种情况&#xff1a;反复加锁 第二种情况 对不同对象嵌套加锁的死锁 3、形成死锁条件 六、wait…

【正点原子FreeRTOS学习笔记】————(10)FreeRTOS时间管理

这里写目录标题 一、延时函数介绍&#xff08;了解&#xff09;二、延时函数解析&#xff08;熟悉&#xff09;三、延时函数演示实验&#xff08;掌握&#xff09; 一、延时函数介绍&#xff08;了解&#xff09; 相对延时&#xff1a;指每次延时都是从执行函数vTaskDelay()开始…

前缀和算法(1)

一维前缀和[模板] 一、题目描述 OJ题目链接&#xff1a;【模板】前缀和_牛客题霸_牛客网 二、思路解析 三、代码 #include <iostream> using namespace std; const int N 100010; long long arr[N], dp[N]; int n, q; int main() {cin >> n >> q;// 读取…

冗余双写方案下数据一致性问题解决及延申问题处理方案

主要整理了采用冗余双写方案后的问题解决方案。 1、问题&#xff1a;冗余双写场景下&#xff0c;如何解决数据一致性问题&#xff1f; 方案一&#xff1a; 直接RPC调用Seata分布式事务框架&#xff0c;采用该方式实现了事务的强一致性&#xff0c;代码逻辑简单的同时业务侵入…

蓝桥杯-正则问题

#include<iostream> #include<string> #include<algorithm> using namespace std;int pos 0, l;//pos当前遍历到的位置&#xff0c;l是正则式的长度 string s;int dfs(){int temp 0, ans 0;//temp保存左半部分 while(pos < l){if(s[pos] (){pos;//跳…