博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj1044】木棍分割
阅读量:6426 次
发布时间:2019-06-23

本文共 1174 字,大约阅读时间需要 3 分钟。

Description

  有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连

接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少种砍的方法使得总长
度最大的一段长度最小. 并将结果mod 10007。。。

Input

  输入文件第一行有2个数n,m.接下来n行每行一个正整数Li,表示第i根木棍的长度.n<=50000,0<=m<=min(n-1,10

00),1<=Li<=1000.

Output

  输出有2个数, 第一个数是总长度最大的一段的长度最小值, 第二个数是有多少种砍的方法使得满足条件.

Sample Input

3 2
1
1
10

Sample Output

10 2

Solution

第一问我们使用二分查找查询每个区间的长度上线是多少

对于第二问,我们使用动态规划

f[i][j]=simga(f[k][j-1])(s[i]-s[k]<=lim)

显然的我们可以使用前缀和来解决问题

然后对于每个i,k最小能取到多少是确定的,我们预处理一下,

然后加个滚动数组就一遍a了,开心!

 

 

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define il inline#define re register#define mod 10007using namespace std;const int N=51111;int n,m,a[N],l=0,r=0,mid,s[N],lim,p[N],f[2][N],lst,now,ans;il bool chk(int lim){ int cnt=0,tot=1; for(int i=1;i<=n;i++){ if(cnt+a[i]<=lim){ cnt+=a[i]; } else{ cnt=a[i];tot++; } } return tot<=m;}int main(){ scanf("%d%d",&n,&m);m++; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); r+=a[i];l=max(l,a[i]); } while(l

 

转载于:https://www.cnblogs.com/ExiledPoet/p/6091194.html

你可能感兴趣的文章
linux下mongodb定时备份指定的集合
查看>>
oVirt JBAS server start failed, ajp proxy cann't server correct. ovirt-engine URL cann't open
查看>>
CDP WebConsole上线公告
查看>>
ubuntu下安装摄像头应用程序xawtv
查看>>
PostgreSQL 如何比较两个表的定义是否一致
查看>>
Ambari安装Hadoop集群
查看>>
WCF学习之旅—基于ServiceDebug的异常处理(十七)
查看>>
CLREX
查看>>
再也不用担心this指向的问题了
查看>>
使用putty远程连接linux
查看>>
【comparator, comparable】小总结
查看>>
Node 版本管理
查看>>
34、重分布配置实验之分发列表distribute-list
查看>>
命令模式-对象行为型
查看>>
VS2017配置、提高生产力、代码辨识度 (工欲善其事必先利其器)新手必备!
查看>>
[Phoenix] 七、如何使用自增ID
查看>>
路由基本配置(上)
查看>>
windows上传文件到linux乱码解决
查看>>
fpm打包zabbix-agent
查看>>
pythopn List(列表)
查看>>