【算法训练营】排序,分组,大转盘(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

相关文章

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py