[HAOI2008]木棍分割

bzoj1044[HAOI2008]木棍分割 Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少种砍的方法使得总长度最大的一段长度最小. 并将结果mod 10007。。。 Input 输入文件第一行有2个数n,m. 接下来n行每行一个正整数Li,表示 阅读详情

这道题磨了我好久……

第一问可以二分出来,对于每个答案,贪心的分割,最后分割出来的段大于m+1的话就不行,这样的

第二问比较麻烦

有这样一个DP方程:

记前缀和为s

f[i][j]=sigma(f[i-1][k])(s[j]-s[k]<=limit)

f[i][j]表示把前j根木棍分割成i段的方案数

那么,暴力算的话复杂度是O(mn^2),TLE无疑

我一开始没有注意到题目性质,如果单看DP方程,是想不到什么好的方法的

经pty提醒发现,由于s这个函数是前缀和,因此k的最小值满足单调性,即随着j的递增,k的最小值单调不减

然后记g[i]为f[i]的前缀和函数,即g[i][j]=sigma(f[i][k])(k=1...j),f的值就等于两个g相减,可以O(1)求

这样对于每一维是线性的,复杂度优化至O(mn)

实际操作时不需要开二维,f也只能开滚动……


第一次提交:MLE,忘记开滚动……

第二次-第n次提交:wa,因为方便取模写了个inc函数,结果顺便把前缀和也取模了……

第n次-第m次提交:wa,贪心分割的过程写wa了……没计算最后一段……

我就是个傻×……不是学clj装B,是真正的那种……


//Lib
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
using namespace std;
//Macro
#define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i)
#define drep(i,a,b) for(int i=a,tt=b;i>=tt;--i)
#define erep(i,e,x) for(int i=x;i;i=e[i].next)
#define irep(i,x) for(__typedef(x.begin()) i=x.begin();i!=x.end();i++)
#define read() (strtol(ipos,&ipos,10))
#define sqr(x) ((x)*(x))
#define pb push_back
#define PS system("pause");
typedef long long ll;
typedef pair<int,int> pii;
const int oo=~0U>>1;
const double inf=1e100;
const double eps=1e-6;
string name="",in=".in",out=".out";
//Var
const int mod=10007;
int n,m,ans,maxx;
int s[50008],a[50008];
int f[2][50008],g[50008],p[50008];
inline void inc(int &x,int y){x+=y;x%=mod;}
bool Check(int limit)
{
	int sum=0,cnt=0,i=1;
	rep(i,1,n)
	{
		sum+=a[i];
		if(sum>limit)cnt++,sum=a[i];
	}
	return cnt+1<=m;
}
int Calc()
{
	int l=maxx,r=s[n],mid;
	while(l<=r)
	{
		mid=l+r>>1;
		if(Check(mid))r=mid-1;
		else l=mid+1;
	}
	return l;
}
//f[i][j]表示i段j根
int Calc(int limit)
{
	int ret=0,now=0,pre,pos=0;
	f[0][0]=1;g[0]=1;
	rep(i,1,n){while(s[i]-s[pos]>limit)pos++;p[i]=pos;g[i]=1;}
	rep(i,1,m)
	{
		pre=now;now^=1;
		memset(f[now],0,sizeof f[now]);
		rep(j,1,n)
			inc(f[now][j],g[j-1]-g[p[j]]+f[pre][p[j]]);
		inc(ret,f[now][n]);g[0]=0;
		rep(j,1,n){g[j]=g[j-1]+f[now][j];}
	}
	return ret;
}
void Work()
{
	scanf("%d%d",&n,&m);m++;
	rep(i,1,n)scanf("%d",a+i),s[i]=s[i-1]+a[i],maxx=max(maxx,a[i]);
	ans=Calc();
	printf("%d %d\n",ans,Calc(ans));
}
int main()
{
//	freopen((name+in).c_str(),"r",stdin);
//	freopen((name+out).c_str(),"w",stdout);
	Work();
	return 0;
}


2025-03-21(DS复习): Databricks 的技术架构 Databricks 的技术架构以 ​为核心,构建了一套高度集成、可扩展且支持多云环境的统一分析平台。其架构设计注重存储与计算的深度融合,并通过丰富的服务层功能简化了数据工程、机器学习和数据科学的工作流。 阅读详情

相关推荐

本地化部署dify,使用Database插件实现dify直连数据库报错No module named ‘MySQLdb‘解决方案

网上查阅各种资料,有说修改/dify-main/docker/volumes/sandbox/dependencies目录下的python-requirements.txt文件,添加了如下两行,试验后无效。,看到有人是其他报错,但是URI配置如下(在mysql后面加了pymysql),尝试后果真成功了。按照系统提示设置完数据库URI后保存出现错误。在工具市场查询Database,点击后进行授权。最后在该插件的项目地址获得灵感。

qiaoxu1989的博客 4333

木棒切割问题(***二分法)

木棒切割问题 给出N根木棒,长度均已知,现在希望通过切割它们来得到至少K段长度相等的木棒(长度必须是整数),问这些长度的木棒最长能有多长。 例如对三根长度分别为10,24,15 的木棒来说,假设 K = 7,即需要至少7段长度相等的木棒,那么可以得到的最大长度为6,在这种情况下,第一根木棒可以提供10/6 = 1段、第二根木棒可以提供24/6 = 4段、第三根木棒可以提供15/...

jiangjiangjiang6的博客 2836

DVT Eclipse保姆级入门教程(一)

介绍 waokspace工作区 是Eclipse平台、已安装插件的存储、配置和临时信息的首选项 在工作区可以定义项目,但不需要将源文件导入或者复制到工作区中,可以在项目中指向任何文件夹或者文件; 路径都不要出现中文; 每次启动Eclipse时,都可以创建一个新的工作空间或指定一个现有的工作空间目录; 可以创建许多工作区,每个工作区专用于某种活动。 project项目 首次创建项目时,Eclipse平台会在你指定的目录中创建一个.project项目。 一些插件可能会在项目目录中创建其他信息,例如DVT创

SummerXRT的博客 1万+

木棒切割问题——算法笔记P134

我理解的作者的意思就是先找到最长的那根木棒,然后利用对这根木棒二分出来的长度L再对其他木棒求,然后总数相加就是k了,和目标值K进行比对。 left = 0,right = 最长木棒长度 求得的木棒个数k >= K,下限left = mid + 1; k< K ,上限 right = mid; #include<cstdio> #include<algorithm&...

qq_40595682的博客 1606

全球、中国各省市县等行政区划(含十段线)shape及geosjon数据免费下载

免费下载全球、中国各省市县等行政区划(含十段线)shape及geosjon数据

mhf403445651的博客 3459

UE4-(反射)场景采集之场景采集2D

一、场景采集分为两种:场景采集2D、场景采集立方体 场景采集2D:采集2D图片模式。 操作: 1.选择场景采集2D,是一个摄像机的物体,摆放到场景中。 2.在文件夹空白处创建纹理,一定要注意创建纹理的格式, 纹理分为立方体渲染目标和渲染目标,此处我们使用的是2D模式,所以选择渲染目标(Texture Render Target2D)。创建后重命名为RenderTextue2D。 3.选择场景中刚拖入的 SceneCapture2D 摄像机在细节面板的Scene Capture 将..

Stone的博客 4601

Sticks<DFS>

题意: 给n个木棍,这些木棍是由m个长度均为L的木棍切割而来,求L的最小值。 思路: DFS+剪枝。 剪枝: 1:L的取值范围在n(max)和n(sum)之间,逐个枚举。sum%L!=0则L不能用。 2:sort对n个木棍长度进行由小到大排序,有以下好处: a:从大的开始搜索。eg:如果L8;5+3>(优势)5+2+1;把更灵活地木棍留...

weixin_30287169的博客 235

华为云CodeHub保姆级教程:从零开始,5分钟搞定本地代码上传(含常见报错解决)

本文提供华为云CodeHub的保姆级教程,从零开始5分钟完成本地代码上传,涵盖环境准备、仓库创建、远程连接及常见报错解决。特别适合新手开发者快速掌握Git命令与云端协作流程,确保代码安全高效上传。

weixin_30443075的博客 480

算法基础题:木棍切割问题

本文章参考https://blog.youkuaiyun.com/qq_30432997/article/details/85283294 为下列问题设计一个动态规划算法。已知小木棍的销售价格pi和长度i相关,i=1,2,…,n,如何把长度为n的木棍切割为若干根长度为整数的小木棍,使得所获得的总销售价格最大?该算法的时间效率和空间效率各是多少? 长度为n的最大价值 price(n)=MAX(price(i)+...

cometo_bowl的博客 5867

数学向量空间的对偶空间解析

对偶空间是线性代数的"进阶语法",它不仅深化了我们对向量空间的理解,还为解决实际问题提供了强大工具。用生活类比解释对偶空间的核心概念,打破"抽象数学"的壁垒;建立对偶空间与原向量空间的直观联系,揭示"对偶"的本质;通过数学推导和代码实现,让读者掌握对偶空间的基本运算;展示对偶空间在科学和工程中的应用,体现其理论价值。范围:本文从有限维实向量空间入手(便于理解),逐步扩展到对偶基、双对偶空间,最后简要提及无限维空间的特殊性。

AI天才研究院 879

PyTorch生成式人工智能(1)——神经网络与模型训练过程详解

在本节中,我们介绍了传统机器学习与人工神经网络间的差异,并了解了如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现了反向传播以优化权重达到最小化损失值的目标。并实现了网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 1万+

【BZOJ 1044】木棍分割

1.题目链接。首先第一问,由于木棍的长度都是非负数,所以前缀和单调不减,这样直接二分这个maxLen就可以得到答案。然后第二问,设dp[i][j]表示把对于前i个,切了j刀满足要求的方案数。这样,dp[i][j]的转移其实很好推: 然后,这里开始优化: (1)首先是空间优化,...

YG爱木木 476

近五年体内微/纳米机器人赋能肿瘤精准治疗综述:以 GBM 为重点

摘要 微/纳米机器人在实体瘤治疗领域展现出突破性潜力,通过主动运动能力解决传统纳米药物递送效率低、渗透不足等核心问题。2021-2025年间形成三条技术路线:1) 磁驱、声驱等运动增强递送实现深层渗透;2) 与免疫治疗融合实现原位免疫唤醒;3) 针对胶质母细胞瘤开发跨屏障递送系统。研究重点从单一运动性能转向"运动-分布-疗效"的系统评价,需建立标准化指标评估运动学参数、肿瘤分布均匀性和安全性。未来挑战在于临床转化的可制造性、闭环操控及生物相容性优化,特别是对血脑屏障穿透等复杂场景的系统集

AllenLV的博客 5124

题解 - [HAOI2008]木棍分割

[HAOI2008]\mathrm{[HAOI2008]}[HAOI2008] 木棍分割 吐槽环节 为什么一分部分分不给啊,一开始写了个n3n^3n3,居然直接爆蛋。 前缀和优化DPDPDP还要滚存 题目意思 题目传送门 Sol\mathrm{Sol}Sol 前置知识:前缀和优化DP 对于第一问就是个hhhhhh问题,直接二分就可以了。这个没什么好讲,看看代码: inline bool...

wangyiyang2的博客 277

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

BZOJ 1044 HAOI2008 木棍分割

1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4241 Solved: 1627 [Submit][Status][Discuss] Description   有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个...

186

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【BZOJ1044】[HAOI2008]木棍分割

【BZOJ1044】[HAOI2008]木棍分割 题面 bzoj 洛谷 题解 第一问显然可以二分出来的。 第二问: 设\(dp[i][j]\)表示前\(i\)个,切了\(j\)组的方案数 发现每次转移都是从前面一个区间过来的 直接前缀和优化就好了 代码 #include <iostream> #include <cstdio> #include <cstdl...

210

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

BZOJ1044 [HAOI2008]木棍分割 【二分+Dp】

1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4281  Solved: 1644 [Submit][Status][Discuss] Description   有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连 接处, 砍完

Mychael的无声乐章 316

1044: [HAOI2008]木棍分割 题解

BZOJ 1044: [HAOI2008]木棍分割 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要

SKY的C 2125

【bzoj1044】【HAOI2008】【木棍分割】

1044: [HAOI2008]木棍分割Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2018 Solved: 730 [Submit][Status][Discuss] Description有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段

Vampire 1692

BZOJ 1044: [HAOI2008]木棍分割 二分 dp

1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3883  Solved: 1492 [Submit][Status][Discuss] Description   有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n

BlackJack 352

[BZOJ1044][HAOI2008]木棍分割

1044: [HAOI2008]木棍分割 Time Limit: 10 SecMemory Limit: 162 MB Submit: 3998Solved: 1537 [Submit][Status][Discuss] Description   有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连 接处, 砍完后...

weixin_30558305的博客 82

BZOJ 1044 HAOI 2008 木棍分割 二分 贪心 动态规划

真是心烦。。似乎一个sb用脚本拼命交30s的while(1)程序卡评测。。这种缺智商的大抵也就会卡oj了。明明有80s的250s的去卡30s的第一问 二分贪心即可得到答案max_cut。 第二问 令f[i][j]f[i][j]表示前i根切j次的方案数。那么显然有 f[i][j]=∑f[k][j−1](a[k+1]+⋯+a[i]≤max_cut)f[i][j]=\sum f[k][j-1](a[k

とある黄鱼のOIブログ 775

P2511 [HAOI2008]木棍分割(二分,动态规划)

P2511 [HAOI2008]木棍分割 题目大意 有nnn根木棍, 第iii根木棍的长度为LeniLen_iLeni​,nnn根木棍依次连结了一起, 总共有n−1n-1n−1个连接处. 现在允许你最多砍断mmm个连接处, 砍完后nnn根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少种砍的方法使得总长度最大的一段长度最小. 题目分析 总长度最大的一段最小:最大值最小问题,可...

仙都一普通市民的blog 682

bzoj.1044: [HAOI2008]木棍分割

1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3311  Solved: 1249 [Submit][Status][Discuss] Description   有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连 接处, 砍完

cx_lzx蒟蒻的博客 202
上一篇: [JSOI2007]文本生成器
下一篇: 无语……root的小幽默
OrpineX
博客等级 码龄17年 16粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值