L1-049 天梯赛座位分配(Python实现) 测试点全过

前言: {\color{Blue}前言:} 前言:

  • 本系列题使用的是,“PTA中的团体程序设计天梯赛——练习集”的题库,难度有L1、L2、L3三个等级,分别对应团体程序设计天梯赛的三个难度。
  • 更新取决于题目的难度,和学校的事情,但尽可能保证每日更新,若没更新次日补上。
  • 这道题说实话有一点难度,做了很长一段时间,思路其实很简单,但是细节很多,所以要测试点全过就和找bug一样
  • 我的方法可能不是最简单的,如有什么好的建议,欢迎各位CSDN的朋友告诉我

题目

天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。

输入格式
输入在一行中给出参赛的高校数 N (不超过100的正整数);第二行给出 N 个不超过10的正整数,其中第 i 个数对应第 i 所高校的参赛队伍数,数字间以空格分隔。

输出格式:
从第 1 所高校的第 1 支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以 1 个空格分隔,行首尾不得有多余空格。另外,每所高校的第一行按“#X”输出该校的编号X,从 1 开始。

输入样例:

3
3 4 2

输出样例:

#1
1 4 7 10 13 16 19 22 25 28
31 34 37 40 43 46 49 52 55 58
61 63 65 67 69 71 73 75 77 79
#2
2 5 8 11 14 17 20 23 26 29
32 35 38 41 44 47 50 53 56 59
62 64 66 68 70 72 74 76 78 80
82 84 86 88 90 92 94 96 98 100
#3
3 6 9 12 15 18 21 24 27 30
33 36 39 42 45 48 51 54 57 60

题解

  • 在开始看具体代码之前,先总结下大致思路,这道题的最大难点,其实就在输出这一块,我最先开始,想尝试直接用一个大的循环,去挨个输出这个结果,但是发现出现了一个关键问题,就是多出来的队伍的座位号,不好处理,然后我就转变了一下思路
  • 既然不好找到具体位置,那我就先那个大的列表把所有输出都揽括进来,再把座位号给装进去,最后按题目要求进行输出吗,即大致为三步:
    1. 建立一个能把所有输出装进去的列表列表,同时先加入高校编号
    1. 把座位号按题目要求装进结果列表
    1. 采用合适的方法输出结果列表

如果想先测试自己的代码,是不是可以过所有测试点,可以测试以下几组数据,看下是否可以达到预期效果:

1
1
3
2 2 2
3
1 2 2
N = int(input())  # 输入参赛的高校数 N
M = list(map(int, input().split()))  # 输入每所高校的参赛队伍数,以列表形式保存# 第一步:建立一个能把所有输出装进去的列表列表,同时先加入高校编号
result = []  # 初始化结果列表for i in range(1, N + 1):  # 遍历高校编号result.append("#" + str(i))  # 添加高校编号for j in range(M[i - 1]):result.append([0] * 10)  # 用列表的形式给座位号占位# 第二步:把座位号按题目要求装进结果列表
"""
在装座位号之前,肯定得先知道每个高校的第一个队伍的第一个人,在结果列表中的位置,
而最好的标志就是高校编号在结果列表中的位置
所以我们需要先找到这么一个数据然后将数据稍加分析,我们会发现:
每个高校的位置 = 上个高校的位置 + 上个高校的队伍数 + 1
而第一所高校的位置就是0,且没有上一所高校,
所以我们在初始化时,就把它加进去"""
university_location_in_result = [0]  # 初始化高校编码在结果中的位置for i in range(1, N):university_location_in_result.append(university_location_in_result[i - 1] + M[i - 1] + 1)  # 这一步解析见上面注释"""
上面是很明显必要的一步,
完成这一步后,我们开始对放入这一部进行分析,
想放入座位号,无非就是解决一个问题:
result[i][j] = ?,这个 ? 肯定是最好解决的,
就是座位号,从1加到最大数,这一步肯定是最外层的“循环”然后来讨论这个 i 和 j 都和哪些条件有关,
这里为了方便分析,我们先简化这个题目,并且使用不那么特殊的一个样例,先将题目中的每队十人,看成每队只有两个人,
输入的样例为
3
1 3 2那么通过上一步可以找到高校编号的位置,为别为0 2 6
然后模拟几步:
result[1][0] = 1 result[4][1] = 4 
result[3][0] = 2 result[5][1] = 5 result[4][0] = 7 result[4][1] = 9 result[5][0] = 11 result[5][1] = 13 
result[7][0] = 3 result[6][1] = 6 result[8][0] = 8 result[8][1] = 10 不难发现 j 其实就是循环的每个队伍有多少人,
当每个高校的第一个队伍循环完的时候,j 就又重新开始循环了,而到底要循环多少次,即轮数,则取决于队伍数最多的高校,
现在便可以确定第二层“循环”是轮数,
第三层“循环”是每队人数,而一直变化的 i 则是最内层“循环”,
且 i = 高校编号位置 + 轮数 + 1,
所以最内层“循环"的是university_location_in_result以上大致思路就解决了,但是有两个特殊点还没有考虑到:
1. 新一轮开始的时候,某一高校以及没有队伍了怎么办?
2. 队伍最多的那个高校,怎么使它多出来的队伍的位置,都不相邻?""""""
这里解决的问题一,
分析可得,当 轮数 = 某个高校的队伍数 的时候,
就不应该在对它的高校编号进行循环了,
所以这两个数据是同存亡,或者说相关联的,
而且我们这里又不好去处理原来的列表,综上,我们将它们组成一个字典,
又因为,高校位置是肯定都不会一样的,
所以用它做 键 """team_information = dict(zip(university_location_in_result, M))
# 也可以这么写:team_information = {team_location_in_result[i]:M[i] for i in range(N)}seat_number = 1  # 初始化座位号"""
这里解决的是问题二,
先把最多队伍高校的多余队伍找出来,
然后根据不同的情况进行处理"""
M_1 = [i for i in M if i != max(M)]  # 除开最大数的M列表difference_value = 0  # 最大队伍数与第二大队伍书数之差if len(M_1) == 0 and N == 1:difference_value = sum(M)  # 这是“只有一个高校”的情况
elif len(M_1) == len(M) - 1:difference_value = max(M) - max(M_1)  # 这是“只有一个队伍数最多的高校”的情况# ”其余情况“都等于0rounds = 0  # 初始化轮数for rounds in range(max(team_information.values())):  # 循环轮数if rounds in team_information.values():  # 当轮数等与某一高校数相同的时候,删除该高校信息team_information = {key: value for key, value in team_information.items() if value != rounds}if seat_number > (sum(M) - difference_value) * 10:  # 这里不处理多余的队伍,所以跳出去breakfor team_number in range(10):  # 循环每队人数for university_location in team_information.keys():  # 循环高校位置,并装入座位号result[university_location + 1 + rounds][team_number] = seat_numberseat_number += 1
"""
这里也有一个特殊点,
就是当有多余队伍的高校,是最后一个高校的时候,
要多一个间隔"""
if max(M) == M[N - 1] and N != 1:seat_number += 1"""
这是处理多余高校"""
for i in range(difference_value):for team_number in range(10):result[list(team_information.keys())[0] + 1 + rounds + i][team_number] = seat_number  # 这个等式不知道怎么来的可以调试看下数据就能明白了seat_number += 2# 第三步:输出结果列表
"""
无非就两种元素类型,
就不同情况输出就可以了"""
for i in result:if isinstance(i, str):print(i)else:print(' '.join(map(str, i)))

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

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

相关文章

POJ 3104 Drying 二分

一、题目大意 求出晾干所有衣服的最短时间,每一件衣服每1秒自动晾干1个单位,如果被烘烤,则每秒晾干k的单位(注意被烘烤时不会有自动晾干的一个单位) 二、解题思路 我们对时间进行二分,最小值为0&#xf…

华为云云服务器评测 [Vue3 博物馆管理系统] 使用Vue3、Element-plus菜单组件构建轮播图

系列文章目录 第一章 定制上中下(顶部菜单、底部区域、中间主区域显示)三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 第三章 使用Vue3、Element-plus菜单组件构建轮播图 [第四章 使用Vue3、Element-plus菜单组件构建组图文章] 华为云云…

【【STM32--28--IO引脚的复用功能】】

STM32–28–IO引脚的复用功能 STM32的IO复用功能 何为复用? 我们先了解一下何为通用 IO端口的输入或输出是由GPIO外设控制,我们称之为通用 复用: IO端口的输入或者是输出是由其他非GPIO外设控制就像经常说的USART 由 DR寄存器进行输出 STM32的IO复用功…

GE MRP680489 IS200VTCCH1CBB印刷电路板

信号处理: 这个印刷电路板通常用于信号处理和数据传输,可以与其他设备或模块进行通信,如传感器、执行器或控制器。 通信接口: IS200VTCCH1CBB 可能具有多种通信接口,用于与其他设备和系统进行数据交换,包括…

软件外包开发人员分类

在软件开发中,通常会分为前端开发和后端开发,下面和大家分享软件开发中的前端开发和后端开发分类和各自的职责,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 前端开发&…

Gorm简单了解

GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly. 04_GORM查询操作_哔哩哔哩_bilibili 前置: db调用操作语句中间加debug()可以显示对应的sql语句 1.Gorm模型定义(理解重点&#xff…

Unity 之 方括号[ ] 的用法以及作用

文章目录 在Unity中,方括号 [ ] 通常用于表示属性、特性(Attributes)或者元数据(Metadata)。这些标记提供了附加信息,可以用于修改类、方法、字段等的行为或者在编辑器中进行设置。 以下是一些常见的用法&…

笔试题目回忆

&#xff08;1&#xff09;给出n,k&#xff0c;n表示数组个数&#xff0c;k表示要剔除的个数&#xff0c;接下来n个数为数组元素&#xff0c;求剔除k个数之后&#xff0c;其他所有数互为倍数&#xff0c;每个数最多剔除一次。 未检测代码&#xff0c;超时。 #include <ios…

[dasctf]misc04

与他不说一模一样吧也差不多 第三届红明谷杯CTF-【MISC】-阿尼亚_keepb1ue的博客-CSDN客flag.zip需要解压密码&#xff0c;在图片中发现一串密文。一串乱码&#xff0c;尝试进行字符编码爆破。获取到密码&#xff1a;简单的编码。https://blog.csdn.net/qq_36618918/article/d…

基于springboot跟redis实现的排行榜功能(实战)

概述 前段时间&#xff0c;做了一个世界杯竞猜积分排行榜。对世界杯64场球赛胜负平进行猜测&#xff0c;猜对1分&#xff0c;错误0分&#xff0c;一人一场只能猜一次。 1.展示前一百名列表。 2.展示个人排名(如&#xff1a;张三&#xff0c;您当前的排名106579)。 一.redis so…

c#继承(new base)的使用

概述 C#中的继承是面向对象编程的重要概念之一&#xff0c;它允许一个类&#xff08;称为子类或派生类&#xff09;从另一个类&#xff08;称为父类或基类&#xff09;继承属性和行为。 继承的主要目的是实现代码重用和层次化的组织。子类可以继承父类的字段、属性、方法和事…

nvidia-smi nvcc -V 及 CUDA、cuDNN 安装

nvidia-smi nvcc -V 及 CUDA、cuDNN 安装 1. 问题缘由2. 分析3. CUDA Driver API 安装3.1 Software & Updates3.2 官网下载 4. CUDA Runtime API 安装5. 安装 cuDNN5.1 cuDNN下载 6. 一点点小注意事项 1. 问题缘由 之前查找 CUDA 版本时都是直接使用的 nvidia-smi 指令&am…

Python---函数

函数定义&#xff1a; """ def 函数名(传入参数):函数体return 返回值 """ 函数调用&#xff1a; """ 函数名(传入参数) """ 例子&#xff1a; # 不带参 def check():print("欢迎光临\n请进") che…

OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字

目录 1.绘制直线line() 2.绘制圆形circle() 3.绘制椭圆形ellipse() 4.绘制矩形rectangle() 5.绘制多边形 fillPoly() 6.绘制文字putText() 7.例子 1.绘制直线line() CV_EXPORTS_W void line(InputOutputArray img,Point pt1, Point pt2,const Scalar& color,int t…

2021年03月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:生日相同 2.0 在一个有180人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。 时间限制:1000 内存限制:65536 输入 第一行为整数n,表示有n个学生,n ≤ 180。此后每行包…

论文阅读_扩散模型_DDPM

英文名称: Denoising Diffusion Probabilistic Models 中文名称: 去噪扩散概率模型 论文地址: http://arxiv.org/abs/2006.11239 代码地址1: https://github.com/hojonathanho/diffusion &#xff08;论文对应代码 tensorflow&#xff09; 代码地址2: https://github.com/AUTOM…

java八股文面试[数据库]——索引的基本原理、设计原则

索引的设计原则 索引覆盖是什么&#xff1a; 索引&#xff08;在MySQL中也叫做“键&#xff08;key&#xff09;”&#xff09; 是存储引擎用于快速找到记录的一种数据结构。这是索引的基本功能。 索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时&#xff0c;索引…

SQLserver基础入门理论(超基础)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

【小沐学Unity3d】3ds Max 多维子材质编辑(Multi/Sub-object)

文章目录 1、简介2、精简材质编辑器2.1 先创建多维子材质&#xff0c;后指定它2.2 先指定标准材质&#xff0c;后自动创建多维子材质 3、Slate材质编辑器3.1 编辑器简介3.2 编辑器使用 结语 1、简介 多维子材质&#xff08;Multi/Sub-object&#xff09;是为一个模形&#xff0…

使用Vue3和Vite升级你的Vue2+Webpack项目

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…