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

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议