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<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<map>
#include<vector>
#include<set>
#define il inline
#define re register
#define mod 10007
using namespace std;
const int N=;
int n,m,a[N],l=,r=,mid,s[N],lim,p[N],f[][N],lst,now,ans;
il bool chk(int lim){
int cnt=,tot=;
for(int i=;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=;i<=n;i++){
scanf("%d",&a[i]);
r+=a[i];l=max(l,a[i]);
} while(l<r){
mid=(l+r)/;
if(chk(mid)) r=mid;
else l=mid+;
}
lim=r;
for(int i=;i<=n;i++) s[i]=s[i-]+a[i];
for(int i=;i<=n;i++){
l=;r=n;
while(l<r){
mid=(l+r)/;
if(s[i]-s[mid-]<=lim) r=mid;
else l=mid+;
}
p[i]=r;
}
lst=;now=;
for(int i=;i<=n;i++)
if(s[i]<=lim) f[lst][i]=f[lst][i-]+;
else f[lst][i]=f[lst][i-];
ans=(f[][n]-f[][n-])%mod;
for(int j=;j<=m;j++){
memset(f[now],false,sizeof(f[now]));
for(int i=j,x;i<=n;i++){
x=(f[lst][i-]-f[lst][max(p[i]-,)])%mod;
f[now][i]=(f[now][i-]+x)%mod;
}
ans=(ans+f[now][n]-f[now][n-]+mod)%mod;
swap(now,lst);
}
cout<<lim<<" "<<ans;
return ;
}

【bzoj1044】木棍分割的更多相关文章

  1. [BZOJ1044木棍分割]

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连 接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段 ...

  2. [bzoj1044]木棍分割

    第一个问题可以用贪心+二分解决第二个问题用f[i][j]表示i次分割后分割到j且满足条件的方案数,$f[i][j]=\sum_{k<j且sum[j]-sum[k]<=ans}f[i-1][ ...

  3. 【czy系列赛】czy的后宫6 && bzoj1044 [HAOI2008]木棍分割

    题目描述 众所周知的是丧尸czy有很多妹子(虽然很多但是质量不容乐观QAQ),今天czy把n个妹子排成一行来检阅.但是czy的妹子的质量实在--所以czy看不下去了.检阅了第i个妹子会增加czy a[ ...

  4. 【BZOJ1044】[HAOI2008]木棍分割(动态规划,贪心)

    [BZOJ1044][HAOI2008]木棍分割(动态规划,贪心) 题面 BZOJ 洛谷 题解 第一问随便二分一下就好了,贪心\(check\)正确性显然. 第二问随便前缀和+单调队列优化一下\(dp ...

  5. 【BZOJ1044】[HAOI2008]木棍分割

    [BZOJ1044][HAOI2008]木棍分割 题面 bzoj 洛谷 题解 第一问显然可以二分出来的. 第二问: 设\(dp[i][j]\)表示前\(i\)个,切了\(j\)组的方案数 发现每次转移 ...

  6. BZOJ1044: [HAOI2008]木棍分割

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1580  Solved: 567[Submit][Statu ...

  7. bzoj1044[HAOI2008]木棍分割 单调队列优化dp

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4314  Solved: 1664[Submit][Stat ...

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

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4281  Solved: 1644 [Submit][St ...

  9. [BZOJ1044][HAOI2008]木棍分割 二分+贪心+dp+前缀和优化

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4112  Solved: 1577 [Submit][St ...

  10. BZOJ 1044 木棍分割 解题报告(二分+DP)

    来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...

随机推荐

  1. 【LeetCode21】Merge Two Sorted Lists★

    1.题目描述: 2.解题思路: 本题是要合并两个已经有序的单链表,思路很简单,有两种方法:非递归和递归. 3.Java代码: (1)非递归: 为方便操作,定义一个辅助的头节点,然后比较原来两个链表的头 ...

  2. 20155339 Exp6 信息搜集与漏洞扫描

    20155339 Exp6 信息搜集与漏洞扫描 实验后回答问题 (1)哪些组织负责DNS,IP的管理. 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.DNS和IP地址管理. ...

  3. windows系统中Dotnet core runtime 安装后,无法启动次程序,因为计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll的解决方法

    因为dotnet core runtime依赖vc++2015,如果系统未安装vc++2015则会报上面的错误 解决方案:先下载安装vc++2015再安装dotnet core runtime, vc ...

  4. Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法

    Java容器类List.ArrayList.Vector及map.HashTable.HashMap的区别与用法 ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数 ...

  5. Phabricator 在 centos 系统下发送 Email的配置

    前言 phabricator 配置email 其实很简单,配好smtp 服务器.端口.协议.用户名和登陆密码,但过程却好麻烦. 开始时跟着官网配 sendmail ,又 google 又 baidu, ...

  6. DFA化简

    首先是未化简DFA的转换表 NFA状态 DFA状态 a b {0,1,2,4,7} A B C {1,2,3,4,6,7,8} B B D {1,2,4,5,6,7} C B C {1,2,4,5,6 ...

  7. Python+Selenium+Unittest+Ddt+HTMLReport分布式数据驱动自动化测试框架结构

    1.Business:公共业务模块,如登录模块,可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_pa ...

  8. (转)Unity内建图标列表

    用法 Gizmos.DrawIcon(transform.position, "PointLight Gizmo"); UnityEditor.EditorGUIUtility.F ...

  9. 【大数据实战】将普通文本文件导入ElasticSearch

    以<刑法>文本.txt为例. 一.格式化数据 1,首先,ElasticSearch只能接收格式化的数据,所以,我们需要将文本文件转换为格式化的数据---json. 下图为未处理的文本文件. ...

  10. 扩展webservice

    描述: 最近一个winform项目刚开发完成.采用c/s架构.闲来把一些技术点整理下了. 做项目之前调研了客户的电脑 .客户端机子性能一般,而且都是基于xp. 这些客观存在的问题,注定了实现过程中必须 ...