小信砍柴的题解

news2024/12/23 14:09:59

目录

原题描述:

时间:1s 空间:256M

题目描述:

输入格式:

输出格式:

样例1输入:

题目大意:

主要思路:

注意事项:

总代码:


原题描述:

时间:1s 空间:256M

题目描述:

小信家里有n段木材,初始长度表示为数组a。他可以进行以下填补操作至多m次(可以不操作):

选择两段木材i,j(i \ne j),将a_i长度截1补到a_j上,即操作后a_i = a_i-1,a_j = a_j+1

填补操作后,小信要将木材都砍成相同长度的小段,并且不能有剩余,请你告诉他最长的小段能有多长?

输入格式:

第一行包含两个整数n,m表示木材数和操作数。

第二行包含n个整数a_1,a_2,...,a_n,表示每段木材的初始长度。

输出格式:

输出一个整数,表示最长的小段的长度。

样例1输入:

2 1

15 9

样例1输出:

样例2输入:

2 10

15 9 

样例2输出:

24 

约定与提示:

对于100%的数据,2 \le n \le 500,1 \le a_i \le 10^6, 0 \le m \le10^9

样例1解释:选择i = 2,j=1操作之后序列变成[16,8],能切成3根长度为8的木材。

样例2解释:选择 i = 2,j=1操作9次之后序列变成[24,0],能切成1根长度为 24 的木材。

题目大意:

就是给你一个数组,然你可以操作最多m次,每次操作可以将一个数-1,另一个数+1,最后问你所有数的最大共约数(就是gcd)

主要思路:

直接上思维导图:

说一下几个重点,给上代码片段:

  1. 求因数:
    int cnt=0;//数组下标 
    for(int i=1;i*i<=sum;i++)//只要枚举到(sqrt(sum)就可以了 
    {
    	if(sum%i == 0)//如果是因数 
    	{
    		factor[cnt++] = i;//用来记录因数,放入因数数组中 
     		if(i*i!=sum)//如果不是sum的平方根 
    	    {
    			factor[cnt++] = sum/i;//sum/i也是sum的因数 
    		}
    	}
    }
  2. 将小的补给大的:
    int t=0;//记录花费次数 
    int pos=1;//记录从哪个小的开始补(就是被减的) 
    for(int i=n;i>=1;i--)//枚举大的 
    {
    	if(b[i]!=0)//如果不是大的(也可以这么理解(被用光了) 
    	{
    	    int x=f-b[i];//记录要消耗的次数(也是要被补多少) 
    	    t+=x;//计入次数 
    	    while(x>0)//如果还需要补 
    	    {
    		    if(b[pos]>=x)//如果小的可以补完 
    	        {
    			    b[pos]-=x;//就补了 
    			    break;//跳出 
    	    	}
    		    else
    		    {
    			    x-=b[pos];//否则就消耗一些要补的 
        			b[pos] = 0;//把小的设成0
    	    		pos++;//就让下一个小的来补 
    		    }
    	    }
        }
    }
    /*
    直接看不太好看,我演示一遍。
    
    当f = 8,b数组为:{1,2,5},pos=1; 
    先枚举到5。t+=3, x=3。
    开始补
    第一次发现不可以全补完。
    b[pos]也就是b[1]<3,那就耗掉一些。b[1] = 0,x=2,pos=2。 
    第二次发现可以补完,那就补完,b[2]-=2就是0,跳出。
    此时的b数组为:{0,0,5}
    i枚举到 2时,b[2] == 0了,也就是被用光了,那就跳过。 
    i枚举到 1时,b[1] == 0了,也就是被用光了,那就跳过。
    现在应该理解了吧。 
    */ 

注意事项:

不要把check中的b写成a了哦。

第一个合法因数输出后要return 0;

总代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[510];
int b[510];
int sum; 
int factor[10010];//用来记录因数 
bool check(int f)
{
    //千万不要把b写成a
	for(int i=1;i<=n;i++)
	{
		b[i] = a[i]%f;
	}
	sort(b+1,b+1+n);
	int t=0;//记录花费次数 
	int pos=1;//记录从哪个小的开始补(就是被减的) 
	for(int i=n;i>=1;i--)//枚举大的 
	{
		if(b[i]!=0)//如果不是大的(也可以这么理解(被用光了) 
		{
			int x=f-b[i];//记录要消耗的次数(也是要被补多少) 
			t+=x;//计入次数 
			while(x>0)//如果还需要补 
			{
				if(b[pos]>=x)//如果小的可以补完 
				{
					b[pos]-=x;//就补了 
					break;//跳出 
				}
				else
				{
					x-=b[pos];//否则就消耗一些要补的 
					b[pos] = 0;//把小的设成0
					pos++;//就让下一个小的来补 
				}
			}
		}
	}
	/*
	直接看不太好看,我演示一遍。
	
	当f = 8,b数组为:{1,2,5},pos=1; 
	先枚举到5。t+=3, x=3。
	开始补
	第一次发现不可以全补完。
	b[pos]也就是b[1]<3,那就耗掉一些。b[1] = 0,x=2,pos=2。 
	第二次发现可以补完,那就补完,b[2]-=2就是0,跳出。
	此时的b数组为:{0,0,5}
	i枚举到 2时,b[2] == 0了,也就是被用光了,那就跳过。 
	i枚举到 1时,b[1] == 0了,也就是被用光了,那就跳过。
	现在应该理解了吧。 
	*/ 
	return t<=m;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		sum+=a[i];
	}
	int cnt=0;//数组下标 
	for(int i=1;i*i<=sum;i++)//只要枚举到(sqrt(sum)就可以了 
	{
		if(sum%i == 0)//如果是因数 
		{
			factor[cnt++] = i;//放入因数数组中 
			if(i*i!=sum)//如果不是sum的平方根 
			{
				factor[cnt++] = sum/i;//sum/i也是sum的因数 
			}
		}
	}
	sort(factor,factor+cnt);
	for(int i=cnt-1;i>=0;i--)//从大到小枚举,这样子第一个合法因数一定是最大的
	{
		if(check(factor[i]))//用来判断每个因数是否合法
		{
			cout<<factor[i];
			return 0;//别忘了return 0;
		}
	}
	return 0;
}

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

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

相关文章

59. 螺旋矩阵 II(java实现,史上最详细教程,想学会的进!!!)

今天来分享一下螺旋矩阵的解题思路及代码的实现。 题目描述如下&#xff1a; 首先拿到这道题&#xff0c;首先不要慌张&#xff0c;我们来仔细分析一下会发现并没有那么难。 首先看下边界的元素是1、2、3递增的&#xff0c;那么我们也许可以根据这一点先把边界的元素一个一个给…

上下界取min/max的线段树问题:P8518 [IOI2021] 分糖果

https://www.luogu.com.cn/problem/P8518 没有要求在线&#xff0c;显然离线&#xff08;。维护时间戳&#xff0c;上线段树。 好了&#xff0c;我们现在知道一个人的曲线变化了。怎么做呢&#xff1f; 前面所有碰上下界的都是没用的&#xff01;我们只需要找最后一段的时间…

TrustZone之顶层软件架构

在处理器中的TrustZone和系统架构中,我们探讨了硬件中的TrustZone支持,包括Arm处理器和更广泛的内存系统。本主题关注TrustZone系统中发现的软件架构。 一、顶层软件架构 下图显示了启用TrustZone的系统的典型软件栈: 【注意】:为简单起见,该图不包括管理程序,尽管它们可…

【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)

系列文章目录 身躯已然冰封&#xff0c;灵魂仍旧火热 本文由睡觉待开机原创&#xff0c;未经允许不得转载。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言&#xff0c;共同进步&#xff01; 文章目录 系列文章目录前言题目链接&#xff08;有需要…

计算机组成原理——数制与编码

1.在以下编码中&#xff0c;零的表示唯一的是&#xff08;C&#xff09; A.反码 B.原码 C.补码 D.原码和移码 2.假设某数的真值为-100 1010B&#xff0c;在计算机内部表示为1011 0110B&#xff0c;该数采用的编码为&#xff08;D&#xff09; A.移码 B.原码 C.反码 D.补码 3.…

Linux shell编程学习笔记36:read命令

目录 0 前言1 read命令的功能、格式、返回值和注意 1.1 命令功能1.2 命令格式1.3 返回值1.4 注意事项2 命令应用实例 2.1 一次读入多个变量值2.2 不指定变量名2.3 测试read命令的返回值2.3 指定输入时限并进行相应处理2.4 -t 指定结束符2.5 -n 指定输入字符个数2.6 -N 指定输入…

分类预测 | Matlab实现AOA-SVM算术优化支持向量机的数据分类预测【23年新算法】

分类预测 | Matlab实现AOA-SVM算术优化支持向量机的数据分类预测【23年新算法】 目录 分类预测 | Matlab实现AOA-SVM算术优化支持向量机的数据分类预测【23年新算法】分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现AOA-SVM算术优化支持向量机的数据分类预测…

css的filter全属性介绍

原图&#xff1a; 模糊&#xff08;blur&#xff09; 单位可为px或rem&#xff0c;值越大&#xff0c;越模糊 filter:blur(3px) filter:blur(0.3rem) 亮度(brightness) 值可为数字或百分数&#xff0c;小于1时&#xff0c;亮度更暗&#xff1b;等于1时&#xff0c;无变化&am…

微信支付怎么申请0.2费率

作为移动支付的主流方式&#xff0c;微信收款和支付宝为商家带来了便利的同时&#xff0c;每笔交易都要收取的0.6&#xff05;收款手续费也成为商家的负担。现在使用现金支付的人少之又少&#xff0c;为了给顾客带来便捷的购物体验&#xff0c;所以即便是要付出手续费&#xff…

十四、YARN核心架构

1、目标 &#xff08;1&#xff09;掌握YARN的运行角色和角色之间的关系 &#xff08;2&#xff09;理解使用容器做资源分配和隔离 2、核心架构 &#xff08;1&#xff09;和HDFS架构的对比 HDFS架构&#xff1a; YARN架构&#xff1a;&#xff08;主从模式&#xff09; &…

visual stdio code运行vue3

npm init vuelatest 该命令初始化vue项目 使用visual stdio code创建vue项目 ,这边是vue-project文件夹 vs code打开项目 vscode操作vue项目 vscode操作vue项目

【Leetcode】旋转矩阵

题目链接&#xff1a;https://leetcode.cn/problems/rotate-matrix-lcci/description/ 题目描述 给你一幅由 N N 矩阵表示的图像&#xff0c;其中每个像素的大小为 4 字节。请你设计一种算法&#xff0c;将图像旋转 90 度。 不占用额外内存空间能否做到&#xff1f; 示例 …

找出一个二维数组中的鞍点

找出一个二维数组中的鞍点&#xff0c;即该位置上的元素在该行上的最大、在该列上最小。也有可能没有鞍点。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() {int a[10][10] { 0 };int n 0, m 0;int i 0, j 0;printf("请输入这个数组有n行m列…

算法学习——栈与队列

栈与队列 栈与队列理论基础用栈实现队列思路代码 用队列实现栈思路代码 删除字符串中的所有相邻重复项思路代码 有效的括号思路代码 逆波兰表达式求值思路代码 滑动窗口最大值思路代码未完待续 前 K 个高频元素思路代码拓展 总结栈在系统中的应用括号匹配问题字符串去重问题逆波…

FPGA时序分析与时序约束(二)——时钟约束

目录 一、时序约束的步骤 二、时序网表和路径 2.1 时序网表 2.2 时序路径 三、时序约束的方式 三、时钟约束 3.1 主时钟约束 3.2 虚拟时钟约束 3.3 衍生时钟约束 3.4 时钟组约束 3.5 时钟特性约束 3.6 时钟延时约束 一、时序约束的步骤 上一章了解了时序分析和约束…

LinuxCNC的使用

先进行程序设置 点击“开始”,选择“创建新的配置” 设置好机床名称和单位 关键是需要设置并口地址 查看并口使用命令:lscpi -v 将使用的并口填入: 这里是设置页面

Vue 自定义搜索输入框SearchInput

效果如下&#xff1a; 组件代码 <template><div class"search-input flex flex-space-between flex-center-cz"><input type"text" v-model"value" :ref"inpuName" :placeholder"placeholder" keyup.enter&…

6.s081操作系统Lab4: trap

文章目录 chapter 4概览4.1 CPU trap流程使用寄存器如果cpu想处理1个trap 4.2 用户态引发的trap4.2.1 uservec4.2.2 usertrap4.2.3 usertrapret和userretusertrapretuserret Lab4Backtrace (moderate)Alarm (hard) chapter 4 概览 trap的场景&#xff1a;系统调用&#xff0c…

Unity3D拆分模型动画展示

系列文章目录 Unity工具 文章目录 系列文章目录前言一、模型拆分功能1-1、首先先搭建一个简单的场景1-2、导入DoTween插件1-3、代码实现1-4、效果展示&#xff08;一个一个拆分的&#xff09; 二、对称模型拆分2-1、规则的&#xff0c;镜像的&#xff0c;对称的都可以使用2-2、…

gitee提交代码步骤介绍(含git环境搭建)

1、gitee官网地址 https://gitee.com; 2、Windows中安装git环境 参考博客&#xff1a;《Windows中安装Git软件和TortoiseGit软件》&#xff1b; 3、设置用户名和密码 这里的用户名和密码就是登录gitee网站的用户名和密码如果设置错误&#xff0c;可以在Windows系统的“凭据管理…