Python解题 - CSDN周赛第30期 - 天然气订单

news2024/12/23 5:39:25

本期比赛的在线测试系统好像出了点问题,导致很多选手最后提交的分数是0,而问哥也遇到好几次提交后一直显示“运行中”而没有结果的情况。鉴于之前遇到过类似情况,不停地刷新页面才得以继续。但是此问题已经存在并持续了好几期,极大地影响了参赛体验,希望官方重视起来并尽快修复。


第一题:天然气订单

天然气运输成本昂贵,危险性高,为了节省运输成本,提倡绿色环保,需要尽可能的优化订单配送,比如相同地区的天然气订单可以一次性配送。现需要向多个地区运输天然气。但是同一个地区可能有多个订单需求。当前仅只知道某些成对的订单是同一个地区的,同一个地区的天然气需要尽可能一次性配送从而降低运输成本,所以需要尽可能的将同一个地区的订单放在一起。订单的编号是1到n。

输入描述:输入第一行是两个正整数n,m,表示订单的数量和已知的关系数量。(1<=n,m<=10000);接下来有m行,每行两个正整数a和b,表示a号订单和b号订单属于同一个地区(1<=a,b<=n);接下来有n行,每行两个正整数x,y,分别表示该车完成A地任务的利润和B地任务的利润。

输出描述:输出第一行包含一个整数x,表示这些订单共来自x个不同的地区。接下来的输出包含x行,每行表示输出若干个订单编号,表示这些订单属于同一个地区,按照订单编号升序输出。优先输出最小的订单编号较小的地区。

示例:

示例
输入7 6
1 2
2 2
3 2
4 5
5 4
6 7
输出3
1 2 3
4 5
6 7

分析

看到“xx的编号是1到n”的描述,首先想到的就是并查集的数据结构。然后发现此题还是求连通子图(同属一个地区的订单),类似此前考过的《蚂蚁家族》和《交际圈》。但是本题除了要求连通子图的个数,还要输出每个子图中的所有节点。

使用深搜(dfs)应该也能做,如果用并查集的话,还需要用到并查集的两个优化操作:路径压缩和按秩合并,不然可能会超时。又因为最后要输出每个连通子图的所有节点,只需要把按秩合并后的并查集中最早出现的“祖先”作为键,其他成员作为值,生成一个字典即可。最后字典中键的个数即连通子图的个数,而每个连通子图的节点也已经排好序了,直接输出即可。

参考代码

n, m = map(int, input().strip().split())
nodes = list(range(n+1))

# 路径压缩的查集操作
def find(n):
    if nodes[n] == n: return n
    nodes[n] = find(nodes[n])
    return nodes[n]

for _ in range(m):
    a, b = map(int, input().strip().split())
    aa = find(a)
    bb = find(b)
    # 按秩合并的并集操作
    if aa < bb: nodes[bb] = aa
    else: nodes[aa] = bb

res = dict()
for i in range(1, n+1):
    if nodes[i] == i:
        res[i] = [i]
    else:
        res[find(nodes[i])].append(i)

print(len(res))
for value in res.values():
    print(*value)

并查集的操作很简单,简单来讲,路径压缩就是每次查找时都把查找路径中所有的节点指向目前的“公共祖先”,使得后面的查找不用再重复查找路径;而按秩合并就是优先把数字更小(排在前面)的节点作为“祖先” ,这样可以使得并查集的树形结构深度最小,更加平衡。而本解法实际利用了按秩排序的最早公共祖先以及排序性质。


第二题:小艺读书

书是人类进步的阶梯。小艺每周因为工作的原因会选择性的每天多读几页或者少读几页。小艺想知道一本n页的书她会在周几读完。

输入描述:第一行输入n(1<=n<=1000);第二行输入7个整数,分别表示周一~周日的读书页数p(0<=p<=1000)。(不考虑7个整数都为0的情况)

输出描述:输出答案。(1-7)

示例:

示例
输入100
15 20 20 15 10 30 45
输出

6

分析

题目描述不是特别好,没有说明从哪一天开始读书,那就只能默认从周一开始了,虽然常识里感觉怪怪的。而测试用例也不全面,没有周日读完的情况,也就是输出7。对于考察循环数组的简单题来说,不完整的测试用例使得本题更水了。

解题方法就是循环模拟,下标每次加一,如果循环至下一周,下标要对7取模。最后输出下标即可。要注意的是如果是周日读完,此时下标为0,要特判输出7,但是本题的测试用例没有出现这种情况。

参考代码

n = int(input().strip())
pages = [int(item) for item in input().strip().split()]
i = 0
while n > 0:
    n -= pages[i]
    i = (i+1)%7
if i == 0: print(7)
else: print(i)

第三题:买苹果

小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。 可是小易现在只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。如果不能购买恰好n个苹果,小易将不会购买。

输入描述:输入一个整数n,表示小易想购买n(1 ≤ n ≤ 100)个苹果

输出描述:输出一个整数表示最少需要购买的袋数,如果不能买恰好n个苹果则输出-1

示例:

示例
输入20
输出

3

分析

我猜本题原本是想考察完全背包,但是由于数据范围很小,1\leq n\leq 100,使用暴力穷举也能过。

因为要买恰好 n 个苹果,所以最多只能买 \frac{n}{6} 袋每袋6个装的苹果,和 \frac{n}{8} 袋每袋8个装的苹果,均向下取整(有点像百钱百鸡)。于是设 0\leq i\leq \frac{n}{6}0\leq j\leq \frac{n}{8},暴力枚举每一种 (i,j) 的组合,如果 6*j+8*j=n ,就把 i+j 的结果保存在集合里。最后输出集合中的最小值即可。如果不存在满足该等式的 (i,j),则集合为空,输出 -1。

参考代码

n = int(input().strip())
res = set()
for i in range((n//6)+1):
    for j in range((n//8)+1):
        if 6*i + 8*j == n:
            res.add(i+j)
if res: print(min(res))
else: print(-1)

算法复杂度为 O(n^2),准确来讲计算了 \frac{n^2}{48} 次,所以当 n 很小时,和使用DP完全背包的算法复杂度 O(mn)(m为物品的种类,本题为2)没有什么区别。关于完全背包,感兴趣的同学可以参考网上资料,问哥之前的文章也有涉及,此处不再赘述。 


第四题:圆桌

有N个客人与足够多张的圆桌。主人安排每位客人坐在一个圆桌边,但是每位客人希望自己左右边上分别有一些空座位,不然会觉得害羞。注意,如果一个客人所在的圆桌只有他一个人,那么他左边的空座位数量就是他右边的空座位数量。试问主人需要准备多少个座位,才能让每个客人舒适的坐下。

输入描述:第一行输入一个整数N,(1<=N<=10000),代表客人的数量;接下来N行,每行两个整数li与ri,(1<=i<=N,1<=li<=ri<=1000000000),代表第i位客人希望左边有li个空座位,右边有ri个空座位。

输出描述:输出一个整数,代表主人需要准备的最少座位数量。

示例:

示例
输入3
1 1
1 1
1 1
输出6

分析

第11期考过的老题,可以参考网上的题解,也可以参考我以前的文章。

本题有一定思维难度,当时问哥也是把时间浪费在证明算法的正确性上了,但如果想通了,代码不过寥寥数行。

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

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

相关文章

三、NetworkX工具包实战2——可视化【CS224W】(Datawhale组队学习)

开源内容&#xff1a;https://github.com/TommyZihao/zihao_course/tree/main/CS224W 子豪兄B 站视频&#xff1a;https://space.bilibili.com/1900783/channel/collectiondetail?sid915098 斯坦福官方课程主页&#xff1a;https://web.stanford.edu/class/cs224w NetworkX…

【Python--XML文件读写】XML文件读写详解

【Python–XML文件读写】XML文件读写详解 文章目录【Python--XML文件读写】XML文件读写详解1. 前言1.1 介绍1.2 用法2. xml文件内容形式3. xml文件读写3.1 项目框架3.1 写入操作&#xff08;创建&#xff09;&#xff08;create_xml.py&#xff09;3.2 读取操作&#xff08;解析…

虚拟 DOM 详解

什么是虚拟 dom&#xff1f; 虚拟 dom 本质上就是一个普通的 JS 对象&#xff0c;用于描述视图的界面结构 在vue中&#xff0c;每个组件都有一个render函数&#xff0c;每个render函数都会返回一个虚拟 dom 树&#xff0c;这也就意味着每个组件都对应一棵虚拟 DOM 树 查看虚拟…

Linux docker(03)可使用GPU渲染的x11docker实战总结

该系列文章的目的旨在之前的章节基础上&#xff0c;使用x11docker构建一个可以使用GPU的docker容器。该容器可以用于3D图形渲染/XR 等使用GPU渲染的程序调试和运行。 0 why docker 为什么非要用x11docker&#xff0c;而不是其他的docker呢&#xff1f; 因为一般的docker是不…

这么好的政策和创新基地,年轻人有梦想你就来

周末有空去参观了下一个朋友办的公司。位置和环境真不错&#xff0c;且租金低的离谱&#xff0c;半年租金才2000元&#xff0c;且提供4个工位。这个创新基地真不赖啊&#xff0c;国家鼓励创新创业&#xff0c;助力年轻人实现梦想。场地有办公区&#xff0c;休息区应有尽有&…

linux集群技术(一)--LVS(负载均衡)(一)

集群功能分类负载均衡LVS概述LVS工作模式轮训算法 1.集群功能分类 1.1 LB &#xff08;一&#xff09;简介 LB&#xff1a;Load Balancing&#xff0c;负载均衡&#xff08;增加处理能力&#xff09;,有一定高可用能力&#xff0c;但不是高可用集群&#xff0c;是以提高服务的…

CData Drivers for Avro v22

CData Drivers for Avro v22 从报告工具或数据库加入ApacheAvro。您还可以根据标准通过驱动程序连接到自定义应用程序。 与BI分析、报告、ETL工具和定制解决方案集成。 用于Avro的CData驱动程序功能强大&#xff1a; BI和分析 我们的驱动程序提供了将实时Avro数据连接到分析、B…

QT 设计一个串口调试工具,用一个工程就能轻松解决,外加虚拟串口工具模拟调试,在日常工作中可类比模块间通信,非常详细建议收藏

QT 串口调试工具第一节 虚拟串口工具安装第二节 QT创建一个基于QWidget的项目第三节 UI界面设计第三节 项目头文件widget.h第四节 项目实现文件widget.cpp第五节 main函数第六节 编译结果重点第七节 使用QT打包程序&#xff0c;不安装QT的电脑可使用第一节 虚拟串口工具安装 -…

【C++】模拟map和set以及改造红黑树

文章目录1、set和map的基础用法1.1 set的基本使用1.2 map的基本使用2、set和map的模拟实现2.1 建立map和set类2.1 红黑树的完善1、set和map的基础用法 stl中&#xff0c;像vector、list、deque等这样的容器&#xff0c;称之为序列式容器&#xff0c;其底层是线性序列的数据结构…

RabbitMQ学习(九):延迟队列

一、延迟队列概念延时队列中&#xff0c;队列内部是有序的&#xff0c;最重要的特性就体现在它的延时属性上&#xff0c;延时队列中的元素是希望 在指定时间到了以后或之前取出和处理。简单来说&#xff0c;延时队列就是用来存放需要在指定时间内被处理的 元素的队列。其实延迟…

005 利用fidder抓取app的api,获得股票数据

一、下载安装fidder 百度搜索fidder直接下载&#xff0c;按提示安装即可。 二、配置fidder 1. 打开fidder&#xff0c;选择tools——options。 2. 选择HTTPS选项卡&#xff0c;勾选前三项&#xff0c;然后点击右侧【actions】&#xff0c;选择【trust root certificate】&a…

七大排序经典排序算法

吾日三省吾身&#xff1a;高否&#xff1f;富否&#xff1f;帅否&#xff1f;答曰&#xff1a;否。滚去学习!!!(看完这篇文章先)目前只有C和C的功底&#xff0c;暂时还未开启新语言的学习&#xff0c;但是大同小异&#xff0c;语法都差不多。目录&#xff1a;一.排序定义二.排序…

fuzz测试之libfuzzer使用小结

fuzz测试之libfuzzer使用小结背景基本原理使用方法主调DEMO参考资料背景 项目中&#xff0c;为测试算法的鲁棒性&#xff0c;经常会用到fuzz测试进行压力测试。fuzz测试是一种模糊测试方法&#xff0c;本质是通过灌入各种变异的随机数据&#xff0c;去遍历不同函数分支&#xf…

蓝桥杯训练day1

前缀和差分1.前缀和(1)3956. 截断数组(2)795. 前缀和(3)796. 子矩阵的和(4)1230. K倍区间(5)99. 激光炸弹2.差分(1)797. 差分(2)差分矩阵(3)3729. 改变数组元素(4)100. 增减序列1.前缀和 (1)3956. 截断数组 方法1&#xff1a;暴力 先用两个数组分别保存前缀和&#xff0c;后缀…

如何快速、全面、深入地掌握一门编程语言

思考路线 如何快速&#xff1f; 什么样的Demo才能让人觉得你掌握了它&#xff1f; 空 判断&#xff1a;构造一个可以判断所有空的 is_empty 函数 for 循环&#xff1a;i 和 集合迭代两种 时间获取&#xff1a;年/月/日 时分秒 时间戳与时间格式互转 休眠时间函数 字符串处理…

对比学习MoCo损失函数infoNCE理解(附代码)

MoCo loss计算采用的损失函数是InfoNCE&#xff1a; ​​ 下面是MoCo的伪代码&#xff0c;MoCo这个loss的实现就是基于cross entropy loss。 将k作为q的正样本&#xff0c;因为k与q是来自同一张图像的不同视图&#xff1b;将queue作为q的负样本&#xff0c;因为queue中含有大量…

【Python学习笔记】44.Python3 MongoDB和urllib

前言 本章介绍Python的MongoDB和urllib。 Python MongoDB MongoDB 是目前最流行的 NoSQL 数据库之一&#xff0c;使用的数据类型 BSON&#xff08;类似 JSON&#xff09;。 PyMongo Python 要连接 MongoDB 需要 MongoDB 驱动&#xff0c;这里我们使用 PyMongo 驱动来连接。…

Ansys Zemax / SPEOS | 光源文件转换器

本文解释了如何在 SPEOS 与 Zemax 之间转换二进制光源文件。 下载 联系工作人员获取附件 简介 在本文中&#xff0c;为用户提供了一组Python代码&#xff0c;用于在Zemax和SPEOS之间转换源文件。 有些光源&#xff0c;如 .IES 文件&#xff0c;可在 SPEOS 和 Zemax 中进行…

计算机网络 | 谈谈TCP的流量控制与拥塞控制

文章目录一、TCP的流量控制1、利用滑动窗口实现流量控制【⭐⭐⭐】2、如何破解【死锁】局面❓二、TCP的拥塞控制1、拥塞控制的一般原理① 解决网络拥塞的误区② 拥塞控制与流量控制的关系【重点理解✔】2、TCP的拥塞控制方法① 接收窗口【rwnd】与拥塞窗口【cwnd】② 慢开始和拥…

BPE(Byte-Pair Encoding)简介

文章目录BPE简介Vocabulary构建Encoding and DecodingBPE简介 BPE是一种数据压缩算法的简单形式&#xff0c;数据中最常见的连续字节对被替换成该数据中不存在的字节。BPE的主要目标就是使用最少的token数目来表示一个corpus 在 A New Algorithm for Data Compression中首次提…