小信砍柴的题解

目录

原题描述:

时间: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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python语言学习笔记之十一(DotEnv)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 1、认识Python DotEnv dotenv是Python中的一个工具包&#xff0c;它主要用于谈取项目中的.env文件&#xff0…

qt-C++笔记之模拟实现一个linux终端窗口

qt-C笔记之模拟实现一个linux终端窗口 code review! 文章目录 qt-C笔记之模拟实现一个linux终端窗口一.运行二.main.cpp三.不足&#xff0c;待改进点 一.运行 二.main.cpp 代码 #include <QApplication> #include <QPlainTextEdit> #include <QLineEdit>…

DataGrip 2023.3 新功能速递!

1 数据可视化 自 DataGrip 2023.3 发布以来&#xff0c;已整合 Lets-Plot 库&#xff0c;实现数据可视化。该可视化功能可用于所有三种类型的网格&#xff1a; 主选项卡&#xff1a;在打开表、视图或 CSV 文件时&#xff0c;在分割模式下显示图表。结果选项卡&#xff1a;在 服…

Day64力扣打卡

打卡记录 方格取数&#xff08;线性DP&#xff09; import sys input sys.stdin.readline 输入样例&#xff1a; 8 2 3 13 2 6 6 3 5 7 4 4 14 5 2 21 5 6 4 6 3 15 7 2 14 0 0 0 输出样例&#xff1a; 67 n int(input()) w [[0] * (n 1) for _ in range(n 1)] while Tru…

flask搞个简单登录界面

登录界面 直接放上login.html模板&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Lo…

Kubernetes 的用法和解析 -- 4

一.Deployment 资源详解 如果Pod出现故障&#xff0c;对应的服务也会挂掉&#xff0c;所以Kubernetes提供了一个Deployment的概念 &#xff0c;目的是让Kubernetes去管理一组Pod的副本&#xff0c;也就是副本集 &#xff0c;这样就能够保证一定数量的副本一直可用&#xff0c;…

LLaMA系列模型

1.LLama 1.1 简介 Open and Efficient Foundation Language Models (Open但没完全Open的LLaMA) 2023年2月&#xff0c;Meta&#xff08;原Facebook&#xff09;推出了LLaMA大模型&#xff0c;使用了1.4T token进行训练&#xff0c;虽然最大模型只有65B&#xff0c;但在相关评…

OpenCV技术应用(7)— 将图像转为热力图

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教大家如何将一幅图像转化成热力图&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍 伪彩色处…

秋招上岸记录咕咕咕了。

思考了一下&#xff0c;感觉并没有单独写这样一篇博客的必要。 能够写出来的&#xff0c;一些可能会对人有帮助的东西都做进了视频里面&#xff0c;未来会在blbl发布&#xff0c;目前剪辑正在施工中&#xff08;&#xff1f;&#xff09; 另外就是&#xff0c;那个视频里面使…

Linux-----12、时间日期

# 时间日期 # 时区设置 在Linux (opens new window)系统中&#xff0c;默认使用的是UTC时间。 即使在安装系统的时候&#xff0c;选择的时区是亚洲上海&#xff0c;Linux默认的BIOS时间&#xff08;也称&#xff1a;硬件时间&#xff09;也是UTC时间 (opens new window)。 在…

银行测试:第三方支付平台业务流,功能/性能/安全测试方法(超详细整理)

1、第三方支付平台的功能和结构特点 在信用方面&#xff0c;第三方支付平台作为中介&#xff0c;在网上交易的商家和消费者之间作一个信用的中转&#xff0c;通过改造支付流程来约束双方的行为&#xff0c;从而在一定程度上缓解彼此对双方信用的猜疑&#xff0c;增加对网上购物…

Python基础教程——项目的组织结构:包、模块、类、函数(实例)!

01 几个重要的概念 1.1 包&#xff1a;可以简单的理解为文件夹的概念 注解&#xff1a;包package是一个文件夹&#xff08;目录&#xff09;&#xff0c;里面包含__init__.py和模块&#xff1b; 1.2 模块&#xff1a;简单的理解为 .py文件 注解&#xff1a;模块module是文件&…

利用原始套接字解决mac地址错误问题【南瑞SysKeeper-2000】

一&#xff1a;案例描述 一键可视顺控图像智能项目在网络部署过程中&#xff0c;对网络限制隔离安全性要求很高&#xff0c;用到正向隔离装置&#xff08;南瑞SysKeeper-2000型号&#xff09;。 图一 正向装置示意图 现场发现问题&#xff1a;直连网线情况下&#xff0c;我方…

深度学习记录--参数与超参数

什么是超参数 在深度学习的神经网络图中&#xff0c;有一堆参数&#xff0c;这些参数分成了普通参数和特殊参数&#xff0c;其中特殊参数往往被称为超参数 超参数(hyper parameters),在某种程度上决定了普通的参数&#xff0c;并且是需要额外给出的 如下图 参数设定 对于超…

滴灌广袤农村——建行江门市分行多维施策惠乡村

江门是全省农业大市、海洋大市&#xff0c;县域面积辽阔&#xff0c;约占全市95%&#xff0c;总人口和GDP约占7成左右&#xff0c;为建行江门市分行服务乡村振兴提供“沃土”。建行江门市分行以新金融行动贯彻新发展理念&#xff0c;主动作为&#xff0c;以数字技术赋能乡村振兴…

202352读书笔记|踪迹——在繁星般的黄的交错里,秦淮河仿佛笼上了一团光雾

《踪迹》朱自清&#xff0c;因为春&#xff0c;匆匆&#xff0c;背影&#xff0c;疯狂入坑。学生时代&#xff0c;我的语文并不好&#xff0c;可害怕写作文了。对于文章/古文/诗都是比较浅显的学习&#xff0c;从未探究深意&#xff0c;可以说并没有学明白。是比较跳脱而表面的…

数据库sql语句查询补充

数据库sql语句查询补充 0.前言1.Like谓语2.带有Having当中的分组查询eg. 例题:错题重做: 3.内连接例题 0.前言 数据库期末复习,对自己做错的题进行知识总结和梳理 1.Like谓语 like谓语主要有两个操作 %:百分号,表示任意长度的字符串_:下划线,表示任意单个字符 like谓语的语…

2020年度NPcon-容器与微服务实践峰会 回顾

一&#xff0c;会议基本信息 时间&#xff1a;12月16日14:00-17:00 地点&#xff1a;上海机遇星球&#xff08;上海市黄浦区南京西路389号明天广场裙楼2楼&#xff09; 电梯旁边的指示牌 会场现场 出来的时候&#xff0c;天快黑了 二&#xff0c;内容回顾 由四个讲座和一个…

Python环境搭建

一、Python运行环境 PATH添加环境变量&#xff0c;方便添加后续工具。 后续自定义安装即可。 交互式解释器&#xff1a; 二、开发环境--PyCharm

79-C语言-小球降落和反弹问题

简介&#xff1a;一个球从100m高度处落下&#xff0c;每次落地后反弹回原高度一半&#xff0c;再落下&#xff0c;再反弹。问&#xff1a;它在第十次落地&#xff0c;共运动了多少米&#xff0c;第十次反弹又多高呢&#xff1f; 看代码注释即可 代码如下&#xff1a; #inclu…