【算法训练营】数字盒子,重编码,成绩排序(python实现)

数字盒子

问题描述

你有一个盒子,你可以往里面放数,也可以从里面取出数。

初始时,盒子是空的,你会依次做 Q 个操作,操作分为两类:

  1. 插入操作:询问盒子中是否存在数 x,如果不存在则把数 x 丢到盒子里。
  2. 删除操作:询问盒子中是否存在数 x,如果存在则取出 x。

对于每个操作,你需要输出是否成功插入或删除。

输入格式

第一行一个正整数 Q,表示操作个数。

接下来 Q 行依次描述每个操作。每行 2 个用空格隔开的非负整数 op,x 描述一个操作:op 表示操作类型,op=1 则表示这是一个插入操作,op=2 则表示这是一个删除操作;x 的意义与操作类型有关,具体见题目描述。

输出格式

按顺序对所有操作输出,对于每个操作输出一行,如果成功则输出“Succeeded”(不含引号),如果失败则输出“Failed”(不含引号)。

样例输入

6
1 100
1 100
2 100
1 200
2 100
2 200

样例输出

Succeeded
Failed
Succeeded
Succeeded
Failed
Succeeded

数据范围

对于 60% 的数据,保证 x<10^5。

对于 100% 的数据,保证 x<10^18,Q≤5*10^5。

对于所有数据,保证 op∈{1,2}。

时间限制:1 s

空间限制:256 MB

提示

[对于 x 较小的情况,我们只需要用数组记录每个数是否在盒子里即可。]

[对于 x 较大的情况,我们可不可以用什么方法把它们“变小”呢?可以想想哈希表哦!]

代码实现

class Box:def __init__(self):self.contents = set()def insert(self, x):if x not in self.contents:self.contents.add(x)return "Succeeded"else:return "Failed"def remove(self, x):if x in self.contents:self.contents.remove(x)return "Succeeded"else:return "Failed"def main():q = int(input())box = Box()for _ in range(q):op, x = map(int, input().split())if op == 1:result = box.insert(x)elif op == 2:result = box.remove(x)print(result)if __name__ == "__main__":main()

重编码

问题描述

输入格式

输出格式

输出一行一个整数,表示整篇文章重编码后的最短长度。

样例输入

4
1
1
2
2

样例输出

12

样例解释

数据范围

提示

[我们希望越长的串出现次数越少,那么贪心地考虑,让出现次数少的串更长。]

[于是我们先区分出出现次数最少的 2 个串,在它们的开头分别添加 0 和 1。]

[接着,由于它们已经被区分(想一想,为什么?),所以我们可以把它们看作是**一个**单词,且其出现次数为它们的和,然后继续上面的“添数”和“合并”操作。]

[这样,我们不停地“合并单词”,直到只剩 1 个单词,即可结束。]

[可以证明这是最优的。]

代码实现

import heapq# 这是求解整个问题的函数
# 返回值:答案
def get_answer():n = int(input())w = [int(input()) for _ in range(n)]# 将所有w加入优先队列pq中pq = []for i in range(n):heapq.heappush(pq, w[i])sum_val = 0  # 置零返回值while len(pq) > 1:  # 当pq中仍有超过多少元素时进行循环呢?new_ele = 0  # 这是本次合并后将要加入队列的新元素# 从pq中取出最小的两个元素并合并for k in range(2):new_ele += heapq.heappop(pq)sum_val += new_ele  # 将本次合并对答案的贡献加入答案heapq.heappush(pq, new_ele)  # 将新元素加入队列return sum_val  # 返回答案# 获取答案并输出
result = get_answer()
print(result)

成绩排序

问题描述

有 n 名学生,它们的学号分别是 1,2,…,n。这些学生都选修了邓老师的算法训练营、数据结构训练营这两门课程。

学期结束了,所有学生的课程总评都已公布,所有总评分数都是 [0,100] 之间的整数。巧合的是,不存在两位同学,他们这两门课的成绩都完全相同

邓老师希望将这些所有的学生按这两门课程的总分进行降序排序,特别地,如果两位同学的总分相同,那邓老师希望把算法训练营得分更高的同学排在前面。由于上面提到的巧合,所以,这样排名就可以保证没有并列的同学了。

邓老师将这个排序任务交给了他的助教。可是粗心的助教没有理解邓老师的要求,将所有学生按学号进行了排序。

邓老师希望知道,助教的排序结果中,存在多少逆序对

如果对于两个学生 (i,j) 而言,i 被排在了 j 前面,并且i 本应被排在 j 的后面,我们就称 (i,j) 是一个逆序对

请你先帮邓老师把所有学生按正确的顺序进行排名,再告诉他助教的错误排名中逆序对的数目。

输入格式

第一行一个整数 n,表示学生的个数。

第 2 行到第 n+1 行,每行 2 个用空格隔开的非负整数,第 i+1 行的两个数依次表示学号为 i 的同学的算法训练营、数据结构训练营的总评成绩。

输出格式

输出包含 n+1 行。

前 n 行表示正确的排序结果,每行 4 个用空格隔开的整数,第 i 行的数依次表示排名为 i 的同学的学号、总分、算法训练营成绩、数据结构训练营成绩。

第 n+1 行一个整数,表示助教的错误排名中逆序对的数目。

样例输入

3
95 85
90 90
100 99

样例输出

3 199 100 99
1 180 95 85
2 180 90 90
2

样例解释

学号为 3 的同学总分为 199,是最高的,所以他应该排第一名。

学号为 1 的同学虽然总分与学号为 2 的同学一致,但是他的算法训练营成绩更高,所以在排名规则下更胜一筹。

原错误排名中的逆序对数目为 2 ,这些逆序对分别为 (1,3) 和 (2,3)。

数据范围

对于 25% 的数据,保证 n=3。

对于 50% 的数据,保证 n≤10。

对于另外 25% 的数据,保证所有同学的总分两两不同。

对于 100% 的数据,保证 n≤5,000 ,且保证不存在成绩完全相同的学生。

时间限制:10 sec

空间限制:256 MB

提示

[可以使用起泡排序将所有学生进行排名。]

[善良的助教提醒你,在起泡排序的过程中,每次交换都会使逆序对数目减少 1 哦!想一想,为什么?]

这道题可以设计出时间复杂度为 O(nlogn) 的算法。]

代码实现

def bubble_sort(arr):n = len(arr)inversion_count = 0for i in range(n):for j in range(0, n-i-1):# 如果当前学生的总分更高,或者总分相同但算法训练营成绩更高,进行交换if arr[j][1] < arr[j+1][1] or (arr[j][1] == arr[j+1][1] and arr[j][2] < arr[j+1][2]):arr[j], arr[j+1] = arr[j+1], arr[j]inversion_count += 1return inversion_count# 输入
n = int(input())
students = []
for i in range(1, n+1):scores = list(map(int, input().split()))students.append((i, scores[0] + scores[1], scores[0], scores[1]))# 使用气泡排序对倒序进行排序和计数
inversion_count = bubble_sort(students)# 输出正确排名
for i in range(n):print(f"{students[i][0]} {students[i][1]} {students[i][2]} {students[i][3]}")# 输出助教错误排名中的逆序对数目
print(inversion_count)

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

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

相关文章

three.js各向异性shader实现记录

文章目录 WebGLMaterialsShaderLiblights_physical_fragment.glsllights_fragment_maps.glsllights_physical_pars_fragment.glsllights_fragment_begin.glsl WebGLMaterials if ( material.anisotropy > 0 ) {uniforms.anisotropyVector.value.set( material.anisotropy *…

【算法系列】隐马尔可夫链预测问题-从维特比到SLAM

前言 视频讲解在我女朋友的B站『隐马尔可夫链预测问题-从维特比到SLAM』 在上一篇文章《终于有人把隐马尔可夫链的前向后向算法讲懂了&#xff01;》中&#xff0c;我们讲解了隐马尔科夫链中三个基本问题中的概率计算问题的前向后向求解方法&#xff1a; 概率计算问题&#x…

LeetCode 399:除法求值(图的bfs遍历)

题目 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件&#xff0c;其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。 另有一些以数组 queries 表示的问题&#xff0c;其中 quer…

Linux---网络套接字

端口号 端口号 端口号是一个2字节16位的整数; 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理; IP地址 端口号能够标识网络上的某一台主机的某一个进程; 一个端口号只能被一个进程占用 在公网上&#xff0c;IP地址能表示唯一的一台主机&…

人工智能如何彻底改变身份欺诈

据 AuthenticID 称&#xff0c;近一半的企业报告合成身份欺诈有所增加&#xff0c;而生物识别欺骗和伪造 ID 欺诈尝试也有所增加。 在当今的数字化存在中&#xff0c;消费者和企业都面临着新的挑战&#xff0c;从考虑数字身份的影响到应对生成人工智能等新工具的使用和流行。与…

MySQL进阶查询篇(8)-存储过程的编写与调用

MySQL 是一种开源的关系型数据库管理系统&#xff0c;在开发过程中&#xff0c;我们通常需要编写存储过程来实现复杂的业务逻辑。本文将介绍如何使用 MySQL 编写和调用存储过程。 存储过程的概念和作用 存储过程是一组预编译的 SQL 语句的集合&#xff0c;类似于函数&#xf…

锐捷(二十)DHCP Snooping + IP Source guard + ARP-check防ARP欺骗方案

DHCP Snooping IP Source guard ARP-check防ARP欺骗方案&#xff1a;在用户PC动态获取IP地址的过程中&#xff0c;通过接入层交换机的DHCP Snooping功能将用户DHCP获取到的&#xff0c;正确的IP与MAC信息记录到交换机的DHCP Snooping软件表&#xff1b;然后通过IP Source gua…

【小沐学GIS】基于WebGL绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

【C语言】C的整理记录

前言 该笔记是建立在已经系统学习过C语言的基础上&#xff0c;笔者对C语言的知识和注意事项进行整理记录&#xff0c;便于后期查阅&#xff0c;反复琢磨。C语言是一种面向过程的编程语言。 原想在此阐述一下C语言的作用&#xff0c;然而发觉这些是编程语言所共通的作用&#…

Tdesign 常用知识

Mock数据中的常见随机数&#xff1a; mock 数据中&#xff0c; 开头的是 Mock.js 的语法。Mock.js 是一个用于生成随机数据的库&#xff0c;它提供了一些特殊的语法&#xff0c;可以方便地生成各种类型的随机数据。 在这个 mock 数据中&#xff0c;使用了以下语法&#xff1a…

C语言如何应⽤ gets()函数?

一、问题 输⼊字符串使⽤的是 gets()函数&#xff0c;其作⽤是将读取的字符串保存在形式参数 str 变量中。那么该如何使⽤该函数呢&#xff1f; 二、解答 gets()函数将⼀直读取字符串&#xff0c;直到出现新的⼀⾏为⽌。其中&#xff0c;新的⼀⾏的换⾏字符将会转化为字符串中…

一键打造属于自己漏扫系统

0x01 工具介绍 本系统是对Web中间件和Web框架进行自动化渗透的一个系统,根据扫描选项去自动化收集资产,然后进行POC扫描,POC扫描时会根据指纹选择POC插件去扫描,POC插件扫描用异步方式扫描.前端采用vue技术,后端采用python fastapi。 0x02 安装与使用 1、Docker部署环境 编译…

C语言学习记录

牛牛学说话之-字符_牛客题霸_牛客网 (nowcoder.com) 总结&#xff1a; 字符定义为char,对应%c 整数定义为int&#xff0c;对应%d 分数对应float&#xff0c;对应%f,内存小&#xff0c;速度快 分数对应double,对应%lf&#xff0c;范围广&#xff0c;精度高 保留几位小数就是…

【JAVA WEB】JavaScipt-1

目录 JavaScipt是什么&#xff1f; JavaScipt能做什么&#xff1f; JavaScipt与HTML、CSS之间的关系 JavaScipt运行过程 JavaScipt的组成 JavaScipt的书写方式 1.行内式 2.内嵌式 3.外部式 语法概览 变量的使用 基本用法 动态类型 什么是强类型变量什么是弱类型…

【MySQL】-21 MySQL综合-7(MySQL主键+MySQL外检约束+MySQL唯一约束+MySQL检查约束)

MySQL主键MySQL外检约束MySQL唯一约束MySQL检查约束 MySQL主键选取设置主键约束的字段在创建表时设置主键约束在创建表时设置复合主键在修改表时添加主键约束 MySQL外键约束选取设置 MySQL 外键约束的字段在创建表时设置外键约束在修改表时添加外键约束删除外键约束 MySQL唯一约…

C++入门学习(二十七)跳转语句—break语句

1、与switch语句联合使用 C入门学习&#xff08;二十三&#xff09;选择结构-switch语句-CSDN博客 #include <iostream> #include <string> using namespace std;int main() { int number;cout<<"请为《斗萝大路》打星(1~5※)&#xff1a;" &…

分支解决冲突 分支管理策略 git merge命令详解

git merge详解 git merge 命令用于合并两个分支的更改。以下是 git merge 命令的一些常用参数&#xff1a; git merge <分支名>&#xff1a; 将指定分支的更改合并到当前分支。 git merge feature-branchgit merge --no-ff <分支名>&#xff1a;这个选项确保总是…

Linux操作系统基础(十一):RPM软件包管理器

文章目录 RPM软件包管理器 一、rpm包的卸载 二、rpm包的安装 RPM软件包管理器 rpm&#xff08;英文全拼&#xff1a;redhat package manager&#xff09; 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项软件包的程序&#xff0c;由于它遵循GPL规则且功能强大方便&…

单片机学习笔记---AT24C02(I2C总线)

目录 有关储存器的介绍 存储器的简介 存储器简化模型 AT24C02介绍 AT24C02引脚及应用电路 I2C总线介绍 I2C电路规范 开漏输出模式和弱上拉模式 其中一个设备的内部结构 I2C通信是怎么实现的 I2C时序结构 起始条件和终止条件 发送一个字节 接收一个字节 发送应答…

MySQL优化及索引

MySQL优化一般会从以下几方面进行入手:引擎&#xff08;MySAM、InnoDB等引擎的选择&#xff09;、表设计&#xff08;可以反三范式添加冗余字段提高检索效率&#xff09;、字段的数据类型&#xff08;数值型字段优于字符串字段&#xff09;、sql书写、索引等方面进行优化&#…