【算法训练营】排序,分组,大转盘(python实现)

2024-02-15 14:52

本文主要是介绍【算法训练营】排序,分组,大转盘(python实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

排序


描述

给出n个整数,将它们从小到大排序后输出。

输入

第一行为一个正整数n,第二行为n个整数。

输出

输出一行n个整数,表示排序后的n个整数。

样例1输入

5
5 4 2 3 -1

样例1输出

-1 2 3 4 5

限制

对于前30%的数据,n ≤ 100,给出的n个整数的绝对值不超过10;

对于前60%的数据,n ≤ 5000,给出的n个整数的绝对值不超过10^9;

对于另20%的数据,n ≤ 500000,给出的n个整数的绝对值不超过10^5;

对于100%的数据,n ≤ 500000,给出的n个整数的绝对值不超过10^9。

时间:2 sec

空间:256 MB

代码实现


# 读取输入
n = int(input())
arr = list(map(int, input().split()))# 使用Python内置的排序函数进行排序
arr_sorted = sorted(arr)# 输出结果
print(" ".join(map(str, arr_sorted)))

分组


描述

有n个正整数排成一排,你要将这些数分成m份(同一份中的数字都是连续的,不能隔开),同时数字之和最大的那一份的数字之和尽量小。

输入

输入的第一行包含两个正整数n,m。

接下来一行包含n个正整数。

输出

输出一个数,表示最优方案中,数字之和最大的那一份的数字之和。

样例1输入

5 2
2 1 2 2 3

样例1输出

5

样例1解释

若分成2和1、2、2、3,则最大的那一份是1+2+2+3=8;

若分成2、1和2、2、3,则最大的那一份是2+2+3=7;

若分成2、1、2和2、3,则最大的那一份是2+1+2或者是2+3,都是5;

若分成2、1、2、2和3,则最大的那一份是2+1+2+2=7。

所以最优方案是第三种,答案为5。

限制

对于50%的数据,n ≤ 100,给出的n个正整数不超过10;

对于100%的数据,m ≤ n ≤ 300000,给出的n个正整数不超过1000000。

时间:4 sec

空间:512 MB

提示

[大家记得看到“最大的最小”这一类语言,一定要想二分能不能做。]

[我们二分最大的那一份的和d,然后从左向右分组,在一组中,在和不超过d的情况下尽量往右分。若最终分出来的组数小于等于m,则这显然是合法的(我们在分出来的组里随便找个地方切开,总能变到m组,且每组的和不超过d)]

[这个d显然是单调的,即,若和不超过d能分成m组,则和不超过d+1也是能分成m组的,故二分正确。]

代码实现

def check(nums, m, mid):# 判断当前mid是否合法count = 1cur_sum = 0for num in nums:if cur_sum + num > mid:count += 1cur_sum = numelse:cur_sum += numreturn count <= mdef binary_search(nums, m):left, right = max(nums), sum(nums)result = 0while left <= right:mid = (left + right) // 2if check(nums, m, mid):result = midright = mid - 1else:left = mid + 1return result# 读取输入
n, m = map(int, input().split())
nums = list(map(int, input().split()))# 调用二分搜索函数
result = binary_search(nums, m)# 输出结果
print(result)

大转盘


时间限制:1 sec

空间限制:256 MB

问题描述

有一个大转盘,被平分成了 2^n 份。

邓老师还有一个长度为 2^n 的数组 a(下标从 0 开始),其中的每个元素都是 0 或 1。于是邓老师就可以选择大转盘上的一个位置,将 a[0] 填入其中,然后按顺时针顺序依次将 a[1],a[2],…,a[2^n-1] 填入。

对于大转盘上的一个指定位置,邓老师可以从它开始,取出顺时针方向的 n 个位置,并将它们按原顺序拼接起来,得到一个长度为 n 的 01 串,也就是一个 n 位二进制数。我们把这个二进制数称作从这个位置开始的幸运数

显然地,大转盘上共有 2^n 个位置可以获得幸运数,而巧合的是 n 位二进制数恰好也有 2^n 个,所以邓老师希望这些所有的幸运数包含了所有的 n 位二进制数。

请输出一个数组 a,使其满足邓老师的要求。(如果有多解,输出任一即可)

下面是一个 n=3 的例子(即样例)。

输入格式

一行一个整数 n。

输出格式

输出一行 2^n 个字符,第 i 个字符(1<=i<=2^n)表示 a[i-1]。

样例输入

3

样例输出

01011100

数据范围

本题包含 16 个测试点。对于第 i 个测试点(1<=i<=16),满足 n=i。

提示

[如果把所有 n-1 位二进制数建立节点,将所有的 n 位二进制数视为单向边。对于边 x,设其前 n-1 位为 u,后 n-1 位为 v,则其连接 u,v。]

[在这张图上求出欧拉回路,想一想,答案与欧拉回路有何关联呢?]

代码实现

#include <iostream>
#include <vector>
using namespace std;// ================= 代码实现开始 =================
// allOne:全1的二进制数,用于二进制“与运算”,allOne = 2^(n-1) - 1
//vis: vis[i][u]表示从u出发,值为i的边
//ans:答案int allOne;
vector<bool> vis[2];
string ans;//计算2^x
//x:指数
//返回值:2^xint twoPow(int x){return 1 << x;
}//求欧拉回路
//u:当前所有节点void dfs(int u){for (int i = 0; i < 2; ++i){if (!vis[i][u]){int v = ((u << 1) | i) & allOne; //将u左移一位,然后将最低位置为i,再将最高位去掉vis[i][u] = 1;dfs(v);ans.push_back('0' + i); //提示:递归v、加入数字到ans中}}
}
/* 请在这里定义你需要的全局变量 */// 本函数求解大转盘上的数,你需要把大转盘上的数按顺时针顺序返回
// n:对应转盘大小,意义与题目描述一致,具体见题目描述。
// 返回值:将大转盘上的数按顺时针顺序放到一个string中并返回
string getAnswer(int n) {//初始化allOne = twoPow(n - 1) - 1;ans = "";for (int i = 0; i < 2; ++i){vis[i].resize(twoPow(n - 1), 0);}dfs(0);return ans;
}// ================= 代码实现结束 =================int main() {int n;scanf("%d", &n);cout << getAnswer(n) << endl;return 0;
}

这篇关于【算法训练营】排序,分组,大转盘(python实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/711705

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小