8. 摆平积木

news2025/1/31 19:58:13

题目:

小明很喜欢玩积木。一天,他把许多积木块组成了好多高度不同的堆,每一堆都是一个摞一个的形式。然而此时,他又想把这些积木堆变成高度相同的。但是他很懒,他想移动最少的积木块来实现这一目标,

你能帮助他吗?

输入:

输入包含多组测试样例。每组测试样例包含一个正整数n,表示小明已经堆好的积木堆的个数。
接着下一行是n个正整数,表示每一个积木堆的高度h,每块积木高度为1。其中1<=n<=50,1<=h<=100。
测试数据保证积木总数能被积木堆数整除。
当n=0时,输入结束。

输出:

对于每一组数据,输出将积木堆变成相同高度需要移动的最少积木块的数量。
在每组输出结果的下面都输出一个空行。

样例:

输入
6
5 2 4 1 7 5
0

输出
5

题意:

        要求最小操作数,使得积木高度相同,换句话来说 给出 a 数组,每操作一次 元素 +1 另一个元素 -1。 使得每个元素最后相同,问最小操作数。

思路:

        贪心思维模拟题。这里测试数据保证积木总数能被积木堆数整除。所以整除之后的结果是我们需要变成相同高度的最优解,其中要使最小操作数,我们最好分成两个部分进行操作。

分成一个部分是 大于 目标高度的,一个部分是小于该目标高度的。

之后进行贪心操作,贪在,

拿 大于 目标高度中的最小高度的积木 拆解-1 放在 小于目标高度中的最大高度的积木上+1

然后统计每次操作数,就是最小操作数了。

代码详解如下:

#include <iostream>
#include <vector>
#include <queue>
#include <unordered_map>
#define endl '\n'
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;

inline void solve()
{
	int n;
	
	// 控制输出格式的换行符
	bool st = false;
	
	while(true)
	{
		scanf("%d",&n);
		
		// n == 0 结束测试
		if(!n) break;
		
		// 输出换行符
		if(st) putchar('\n');
		
		// 目标高度
		int h = 0;
		
		// 每个积木高度
		vector<int>v;
		
		for(int i = 0,x;i < n;++i)
		{
			scanf("%d",&x);
			v.emplace_back(x);
			h += x;
		}
		
		// 求解目标高度
		h /= n;
				
		// 通过优先队列排序好小于目标高度的部分
		// 排序是 由高到低
		priority_queue<int>minH;
		
		// 通过优先队列排序好大于目标高度的部分
		// 排序是 由低到高
		priority_queue<int,vector<int>,greater<int> >maxH;
		
		// 开始遍历分开成两个部分
		for(auto i : v)
		{
			// 如果等于了目标高度,没必要拆分
			if(i == h) continue;
			if(i > h) maxH.push(i);
			if(i < h) minH.push(i);
		}
		
		// 开始模拟最优拆分
		int ans = 0;	// 答案操作数
		
		int maxh = h,minh = h;	// 各部分 取出的积木高度		
		
		while(maxH.size() || minH.size())
		{
			// 如果取出的积木到达了目标高度
			// 我们重新取新的积木
			if(maxh == h)
			{
				maxh = maxH.top();
				maxH.pop();
			}
			if(minh == h)
			{
				minh = minH.top();
				minH.pop();
			}
			
			// 开始拆分
			while(maxh != h && minh != h)
			{
				--maxh;
				++minh;
				++ans;
			}
		}		
		printf("%d\n",ans);
		st = true;
	}
}


int main()
{
//	freopen("a.txt", "r", stdin);
//	___G;
	int _t = 1;
//	cin >> _t;
	while (_t--)
	{
		solve();
	}

	return 0;
}

最后提交:

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

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

相关文章

DevEco Studio 配置

首先,打开deveco studio 进入首页 …我知道你们想说什么,我也想说 汉化配置 没办法,老样子,先汉化吧,毕竟母语看起来舒服 首先,点击软件左下角的configure,在配置菜单里选择plugins 进入到插件页面, 输入chinese,找到汉化插件,(有一说一写到这我心里真是很不舒服) 然后点击o…

2023年05月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;字符串插入 有两个字符串str和substr&#xff0c;str的字符个数不超过10&#xff0c;substr的字符个数为3。&#xff08;字符个数不包括字符串结尾处的’\0’。&#xff09;将substr插入到str中ASCII码…

百万级并发IM即时消息系统(4)Swagger

golang swagger注解说明_go swagger 注释_mctlilac的博客-CSDN博客 Gin(十):集成 Swagger - 掘金 (juejin.cn) 手把手详细教你如何使用go-swagger文档 - 掘金 (juejin.cn) 08_Swagger&Logger复盘整理_哔哩哔哩_bilibili 1.配置swagger 1&#xff09;swagger ginSwag…

kafka详解一

kafka详解一 1、消息引擎背景 根据维基百科的定义&#xff0c;消息引擎系统是一组规范。企业利用这组规范在不同系统之间传递语义准确的消息&#xff0c;实现松耦合的异步式数据传递. 即&#xff1a;系统 A 发送消息给消息引擎系统&#xff0c;系统 B 从消息引擎系统中读取 A…

[dasctf]misc04

与他不说一模一样吧也差不多 第三届红明谷杯CTF-【MISC】-阿尼亚_keepb1ue的博客-CSDN客flag.zip需要解压密码&#xff0c;在图片中发现一串密文。一串乱码&#xff0c;尝试进行字符编码爆破。获取到密码&#xff1a;简单的编码。https://blog.csdn.net/qq_36618918/article/d…

IE浏览器攻击:MS11-003_IE_CSS_IMPORT

目录 概述 利用过程 漏洞复现 概述 MS11-003_IE_CSS_IMPORT是指Microsoft Security Bulletin MS11-003中的一个安全漏洞&#xff0c;影响Internet Explorer&#xff08;IE&#xff09;浏览器。这个漏洞允许攻击者通过在CSS文件中使用import规则来加载外部CSS文件&#xff0…

【Locomotor运动模块】攀爬

文章目录 一、攀爬主体“伪身体”1、“伪身体”的设置2、“伪身体”和“真实身体”&#xff0c;为什么同步移动3、“伪身体”和“真实身体”&#xff0c;碰到墙时不同步的原因①现象②原因③解决 二、攀爬1、需要的组件&#xff1a;“伪身体”、Climbing、Climbable及Interacto…

QT实现任意阶贝塞尔曲线绘制

bezier曲线在编程中的难点在于求取曲线的系数&#xff0c;如果系数确定了那么就可以用微小的直线段画出曲线。bezier曲线的系数也就是bernstein系数&#xff0c;此系数的性质可以自行百度&#xff0c;我们在这里是利用bernstein系数的递推性质求取&#xff1a; 简单举例 两个…

爬楼梯【动态规划】

爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; class Solution {public int climbStairs(int n) {if (n < 2) return n;//特殊情况处理int dp[] new int[n 1];dp[1] 1;//因为数组索…

20个不可错过的VScode神级插件

VS Code 是我们打发时间时最常用的代码编辑器之一&#xff0c;它是一个多功能伴侣&#xff0c;重新定义了我们软件开发的方式。其轻量级的界面与强大的功能相结合&#xff0c;使其成为全球程序员的首选。但是&#xff0c;普通 VS Code 用户与熟练开发人员的区别在于通过扩展充分…

11. Junit

我们主要学习的是 Junit5. 1. selenium 和 Junit 之间的关系 selenium 和 Junit 之间的关系 就像 Java 和 JavaScript 之间的关系&#xff0c;也就是没有关系。 为什么学习了 selenium 还要学习 Junit 呢&#xff1f; 举个例子&#xff0c;如果 Selenium 编写的自动化测试用…

【图像分割】实战篇(1)传统图像分割

聚类图像分割 K均值聚类是一种常用的聚类算法&#xff0c;它将图像像素分为K个不同的群集&#xff0c;以使每个群集内的像素具有相似的颜色或强度。这可以用于分割具有不同颜色或亮度的对象。 import numpy as np import matplotlib.pyplot as plt from sklearn.cluster impo…

单片机-控制按键点亮LED灯

1、按键电路图 定义四个按键引脚 1、按键按下 为 输入为低电平 2、按键不按下 IO有上拉电阻&#xff0c;为高电平 // 定义 按键的 管教 sbit KEY1 P3^1; sbit KEY2 P3^0; sbit KEY3 P3^2; sbit KEY4 P3^3; 2、LED灯电路图 LED 输出高电平为亮 // 定义LED灯 管教 sbit LED1…

基于SpringBoot2的后台业务管理系统

概述 SpringBoot-Plus 是一个适合大系统拆分成小系统的架构&#xff0c;java快速开发平台&#xff0c;或者是一个微服务系统。其中加入了Thymeleaf数据模板语言代替了之前的JSP页面方式。页面展示采用Layui前端框架&#xff0c;包含了用户管理&#xff0c;角色管理&#xff0c…

获取Linux内核源码

在嵌入式平台上做Linux开发的时候&#xff0c;我们用的kernel都是芯片厂家移植到自家平台上的&#xff0c;但是最初的原生Linux内核的源码是从哪里来的呢&#xff1f;下面我们介绍一下怎么获取原生的Linux源码。 从Linux社区获取内核kernel源码 Linux社区的官方网站是 https:…

【Day-26慢就是快】代码随想录-二叉树-对阵二叉树

给定一个二叉树&#xff0c;检查它是否是镜像对称的。 —————————————————————————————————————————— 分析&#xff1a; 需要比较的是根节点的左右子树&#xff0c;且是两个子树的里侧和外侧的元素是否相等。 根据后序遍历算法&…

Modbus通信协议

Modbus通信协议 一、概述 Modbus通信协议是一种工业现场总线协议标准&#xff0c;常用的Modbus协议有以下三种类型&#xff1a;Modbus TCP、Modbus RTU、Modbus ASCll。 Modbus通信协议解决了通过串行线路在电子设备之间发送信息的问题。该协议在遵循该协议的体系结构中实现主…

网络分层的真实含义

复杂的程序都要分层&#xff0c;这是程序设计的要求。比如&#xff0c;复杂的电商还会分数据库层、缓存层、Compose 层、Controller 层和接入层&#xff0c;每一层专注做本层的事情。 当一个网络包从一个网口经过的时候&#xff0c;你看到了&#xff0c;首先先看看要不要请进来…

如何进行微服务测试?一文4个知识点带入门微服务测试!

关注留言点赞&#xff0c;带你了解最流行的软件开发知识与最新科技行业趋势。 本文将讨论微服务测试的重要性、挑战和最佳实践。 微服务架构是一种越来越流行的构建复杂分布式系统的方法。在此体系结构中&#xff0c;大型应用程序被分成较小的、独立的服务&#xff0c;这些服务…

uniapp 实现滑动元素删除效果

官网地址&#xff1a;uni-app官网 (dcloud.net.cn) 最终效果如下图&#xff1a; 滑动删除需要用到 uni-ui 的 uni-swipe-action 组件和 uni-swipe-action-item 属性名类型可选值默认值是否必填说明left-optionsArray/Object--否左侧选项内容及样式right-optionsArray/Object--…