当前位置: 首页 > news >正文

[洛谷P2511][HAOI2008]木棍分割

题目大意:有$n(n\leqslant5\times10^4)$根木棍,连续放在一起,把它们分成$m(\leqslant10^3)$段,要求使得最长的段最短,问最短的长度以及方案数

题解:要使得最长的段最短,可以想到二分,然后方案数$DP$,令$f_{i,j}$表示现在是第$i$段,在第$j$根木棍后分段的方案数,$f_{i,j}=\sum\limits_{k=1\\dis(k,j)\leqslant res}^jf_{i-1,k}$($dis(i,j)$表示第$i$根小木棍到第$j$根小木棍的总长度,$res$表示最短的长度),可以用双指针优化到$O(nm)$

卡点:

  1. $check$程序返回了一个$bool$
  2. 一个地方没取模

 

C++ Code:

#include <algorithm>
#include <cstdio>
#define maxn 500010
const int mod = 10007;
inline void reduce(int &x) { x += x >> 31 & mod; }

int n, m, res, ans;
int li[maxn];
int f[2][maxn], now = 1, past = 0;

inline int check(int mid) {
	int cnt = 0, res = 0;
	for (int i = 1; i <= n; ++i) {
		if (cnt + li[i] > mid) {
			cnt = 0;
			++res;
		}
		cnt += li[i];
	}
	return res + static_cast<bool> (cnt);
}

int main() {
	scanf("%d%d", &n, &m); ++m;
	{
		int l = 1, r = 0;
		for (int i = 1; i <= n; ++i) {
			scanf("%d", li + i);
			l = std::max(li[i], l);
			r += li[i];
		}
		while (l <= r) {
			int mid = l + r >> 1;
			if (check(mid) <= m) r = mid - 1, res = mid;
			else l = mid + 1;
		}
	}
	printf("%d ", res);
	f[now][0] = 1;
	for (int i = 1; i <= m; ++i) {
		static const int sz = sizeof f[now];
		std::swap(now, past);
		__builtin_memset(f[now], 0, sz);
		int len = 0, up = f[past][0], lst = 0;
		for (int j = 1; j <= n; ++j) {
			len += li[j];
			while (len > res) {
				reduce(up -= f[past][lst]);
				len -= li[++lst];
			}
			f[now][j] = up;
			reduce(up += f[past][j] - mod);
		}
		reduce(ans += f[now][n] - mod);
	}
	printf("%d\n", ans);
	return 0;
}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/10327845.html

相关文章:

  • C语言之路-2-判断
  • JavaScript面向对象名词详解
  • java对象拷贝最完全解说
  • JVM,DVM,ART
  • 微软工程师认为 Mozilla 也应该拥抱 Chromium
  • 司法部:做好春节期间在押罪犯的离监探亲工作
  • 斯内德将出任2020欧洲杯荷兰地区形象大使
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • 使用Jmeter输出错误响应结果到日志
  • Hunt framework 2.0.0 发布,简单且高性能的 Web 服务框架
  • 补贴退坡幅度进一步加大 新能源汽车会涨价吗
  • Linux基础_软件包管理
  • Nginx配置文件的高亮显示设置
  • 【leetcode】983. Minimum Cost For Tickets
  • BZOJ 2810 [Apio2012]kunai
  • 2019年如何成为全栈工程师?
  • 345-反转字符串中的元音字母
  • gops —— Go 程序诊断分析工具
  • jquery cookie
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • spark本地环境的搭建到运行第一个spark程序
  • vue自定义指令实现v-tap插件
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 大数据与云计算学习:数据分析(二)
  • 代理模式
  • 力扣(LeetCode)21
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 普通函数和构造函数的区别
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 函数计算新功能-----支持C#函数
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • ###C语言程序设计-----C语言学习(3)#
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (06)金属布线——为半导体注入生命的连接
  • (52)只出现一次的数字III
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (安卓)跳转应用市场APP详情页的方式
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • *p++,*(p++),*++p,(*p)++区别?
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • ../depcomp: line 571: exec: g++: not found
  • .md即markdown文件的基本常用编写语法
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net core Swagger 过滤部分Api
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • /etc/fstab 只读无法修改的解决办法
  • @拔赤:Web前端开发十日谈
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例