【问题描述】

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

【输入格式】
输入文件第一行有2个数n,m
接下来n行每行一个正整数Li,表示第i根木棍的长度.

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

对答案mod10007.

【输入样例】
3 2
1
1
10

【输出样例】
10 2

样例说明:两种砍的方法:(1)(1)(10)和(11)(10)

【数据范围】

n<=50000,0<=m<=min(n-1,1000)
1<=Li<=1000

题解:

最大值最小可以二分答案

第二问一开始一眼看成了组合数emmmmm

dp 令f[i][j]为前i段木棍砍j刀的方案数

那么显然f[i][j]=∑f[k][j-1] (sum[i]-sum[k]<=ans&&k<i)

转移用单调队列优化

这样时间复杂度O(n*m)

空间可以用滚动数组滚第二维(f[][j]只与f[][j-1]有关但第一维不是)

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <deque>
using namespace std;
const int maxn=50000+10;
const int MOD=10007;
int n,m;
int len[maxn],sum[maxn];
long long f[maxn][2];
deque<int>q;
inline bool judge(int x){int summ=0,cnt=0;for(int i=1;i<=n;i++){if(len[i]>x)return false;if(summ+len[i]>x){summ=len[i];cnt++;}else summ+=len[i];}return cnt<=m;
}
inline long long dp(int x){int now=0;long long summ=0;long long ans=0;for(int j=0;j<=m;j++){summ=0;while(!q.empty())q.pop_front();if(j==0){for(int i=1;i<=n;i++)if(sum[i]<=x)f[i][now]=1;}else {for(int i=1;i<=n;i++){while(!q.empty()&&sum[i]-sum[q.front()]>x){summ-=f[q.front()][1-now];summ=(summ+MOD)%MOD;q.pop_front();}f[i][now]=summ;q.push_back(i);summ+=f[i][1-now];summ=(summ+MOD)%MOD;}}ans+=f[n][now];ans%=MOD;now=1-now;}return ans;
}
int main(){freopen("stick.in","r",stdin);freopen("stick.out","w",stdout);scanf("%d %d",&n,&m);int summ=0;for(int i=1;i<=n;i++){scanf("%d",&len[i]);summ+=len[i];sum[i]=sum[i-1]+len[i];}int l=0,r=summ;while(l+1<r){int mid=(l+r)>>1;if(judge(mid))r=mid;else l=mid+1;}int ans;if(judge(l))ans=l;else ans=r;printf("%d\n%lld\n",ans,dp(ans));
return 0;
}

haoi2008木棍分割解题报告相关推荐

  1. bzoj 1044: [HAOI2008]木棍分割(二分+DP)

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

  2. BZOJ1044: [HAOI2008]木棍分割 (二分 + DP)

    题意:n根木棍依次连在一起 最多切m个端点 使得最长的一段最小 在保证最长的最小的情况下 有多少种不同的切法 题解:第一问傻子都知道二分 第二问想了一会不会做 但其实就是很简单的dp dp[i][j] ...

  3. 【bzoj1044】[HAOI2008]木棍分割 二分+dp

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

  4. BZOJ1044: [HAOI2008]木棍分割(dp 单调队列)

    题意 题目链接 Sol 比较套路的一个题. 第一问二分答案check一下 第二问设\(f[i][j]\)表示前\(i\)个数,切了\(j\)段的方案数,单调队列优化一下. 转移的时候只需要保证当前段的 ...

  5. 木棍分割[HAOI2008]

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

  6. USACO Section2.1 Hamming Codes 解题报告 【icedream61】

    hamming解题报告 ---------------------------------------------------------------------------------------- ...

  7. 解题报告 Toy Bricks

    Toy Bricks [题目描述] Ray又在NPC问题了:这里有一个箱子,还有若干个玩具. 我们可以假设玩具的数量是没有上限的.我们还知道这个箱子是不规则的,或者可以说,他的外形比较像一个矩形,但是 ...

  8. 山东科技大学第二届ACM校赛解题报告

    这次校赛的目的,是为了省赛测试各种程序是否有问题. 热身赛的逗比题有点打击我,感觉正式赛应该不会出这种问题.开始的时候直接上了A题,然后大概是第六,前面好多友情队,正式队排名第二. 然后读了读B题,稍 ...

  9. 【解题报告】2021牛客寒假算法基础集训营4

    [解题报告]2021牛客寒假算法基础集训营4 前面的话 A :九峰与签到题 | 模拟 (签到题) B: 武辰延的字符串 | exKMP D :温澈滢的狗狗 | 二分 E: 九峰与子序列 | d p d ...

最新文章

  1. 一天一点T-SQL:使用登录触发器进行安全管控
  2. Linux基本C编程fork、signal、time以及用printf在终端打印一个GUI窗口 - 使用cygwin
  3. 小米手机安装https证书报错:无法安装该证书 因为无法读取该证书文件
  4. linux高编IO-------opendir、closedir、readdir
  5. Rusty String
  6. Linux学习笔记-生成动态库(补充说明)
  7. 百度SEO最新强引蜘蛛软件工具
  8. 【latex】向量矩阵中的点点点 一个点 三个点 横着点 竖着点 斜着点
  9. python unicode转字符串_Python2.X如何将Unicode中文字符串转换成 string字符串
  10. 完美解决header,footer等HTML5标签在IE(IE6/IE7/IE8)无效的方法
  11. 163邮箱苹果设置不成功_苹果变安卓不是不可能,Corellium让iPhone成功安装安卓系统...
  12. Redis windows端连接虚拟机内Redis各种问题
  13. 【博客迁移】hyrepo.com
  14. [转载] New Concept English 1——Lesson 12 Whose is this…?This is my/your/her…
  15. navicat for mysql 破解版 中文免费
  16. 笔记本电脑双显卡怎么切换独立显卡的方法
  17. 使用输出语句输出一个正方形
  18. 面试官嘲笑我,这你都不会?
  19. JetBrains下载历史版本(IDEA、PyCharm、WebStorm、PhpStorm等)
  20. Open For Bussiness (HelloWorld)

热门文章

  1. oracle中去掉回车、Tab、制表、空格等特殊符号
  2. 数据分析 时间序列分析 概述
  3. linux怎么查找接口,Linux终端命令接口(五)查找与搜索
  4. 在Mac上安装Ruby on Rails
  5. win8.1 如何查看com端口号
  6. js如何保留两位小数
  7. 徐工培训计算机,走进徐工,迈向成功——徐工数元教育2018大型培训纪实
  8. 光格科技将于12月6日上会:拟募资6亿元,姜明武为实控人
  9. 晨风机器人发送图片_晨风机器人基本使用说明
  10. MATLAB弹出对话框的使用