BZOJ 1044 HAOI2008 木棍切割 二分答案+动态规划
题目大意:给定n个连在一起的木棍。分成m+1段。使每段最大值最小,求最大值的最小值及最大值最小时切割的方案数
第一问水爆了……二分答案妥妥秒过
第二问就有些难度了 首先我们令f[i][j]表示用前j个棒♂子得到i段的方案数
诶我没打什么奇怪的符号吧
于是我们有动规方程
f[i][j]=Σf[i-1][k] (sum[j]-sum[k]<=ans,k<j)
这个最坏情况下是O(m*n^2)的,肯定挂
我们发现k的下界是单调上升的 于是我们直接令k为当前j时k的下界。开一个变量记录k~j的f值之和
每次j++时将k向后调整 此外f数组要开滚动数组不然MLE
写完交上去各种神慢……搞不懂其它人都写了啥
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 50500
#define Mo 10007
using namespace std;
int n,m,limit,ans;
int maxlen=0,a[M],sum[M];
int f[2][M];
inline bool Judge(int x)
{
int i,re=0,now=x;
for(i=1;i<=n;i++)
{
if(now+a[i]>x)
++re,now=a[i];
else
now+=a[i];
if(re>m)
return false;
}
return true;
}
inline int Bisection()
{
int l=maxlen,r=sum[n];
while(l+1<r)
{
int mid=l+r>>1;
if( Judge(mid) )
r=mid;
else
l=mid;
}
if( Judge(l) )
return l;
return r;
}
int main()
{
int i,j,k;
cin>>n>>m;++m;
for(i=1;i<=n;i++)
scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i],maxlen=max(maxlen,a[i]);
limit=Bisection();
f[0][0]=1;
for(i=1;i<=m;i++)
{
int temp=0;k=i-2;
for(j=i;j<=n;j++)
{
temp+=f[~i&1][j-1],temp%=Mo;
while(sum[j]-sum[k+1]>limit)
temp+=Mo-f[~i&1][++k],temp%=Mo;
f[i&1][j]=temp;
}
ans+=f[i&1][n],ans%=Mo;
}
cout<<limit<<' '<<ans<<endl;
}
BZOJ 1044 HAOI2008 木棍切割 二分答案+动态规划的更多相关文章
- BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)
第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...
- [BZOJ 1044] [HAOI2008] 木棍分割 【二分 + DP】
题目链接:BZOJ 1044 第一问是一个十分显然的二分,贪心Check(),很容易就能求出最小的最大长度 Len . 第二问求方案总数,使用 DP 求解. 使用前缀和,令 Sum[i] 为前 i 根 ...
- bzoj 1044 [HAOI2008]木棍分割(二分+贪心,DP+优化)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1044 [题意] n根木棍拼到一起,最多可以切m刀,问切成后最大段的最小值及其方案数. ...
- 【BZOJ】1044: [HAOI2008]木棍分割 二分+区间DP
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1044 Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, ...
- bzoj 1044: [HAOI2008]木棍分割【二分+dp】
对于第一问二分然后贪心判断即可 对于第二问,设f[i][j]为已经到j为止砍了i段,转移的话从$$ f[i][j]=\sigema f[k][j-1] (s[j]-s[k-1]<=ans) 这里 ...
- BZOJ 1044: [HAOI2008]木棍分割
Description 求 \(n\) 根木棍长度为 \(L\) ,分成 \(m\) 份,使最长长度最短,并求出方案数. Sol 二分+DP. 二分很简单啊,然后就是方案数的求法. 状态就是 \(f[ ...
- BZOJ 1044: [HAOI2008]木棍分割 DP 前缀和优化
题目链接 咳咳咳,第一次没大看题解做DP 以前的我应该是这样的 哇咔咔,这tm咋做,不管了,先看个题解,再写代码 终于看懂了,卧槽咋写啊,算了还是抄吧 第一问类似于noip的那个跳房子,随便做 这里重 ...
- bzoj 1044 [HAOI2008]木棍分割——前缀和优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1044 前缀和优化. 但开成long long会T.(仔细一看不用开long long) #i ...
- 1044: [HAOI2008]木棍分割
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2161 Solved: 779[Submit][Statu ...
随机推荐
- Java中继承,类的高级概念的知识点
1. 继承含义 在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类,这种方式称为继承(inheritance). 2. 继承的优点 A.代码的可重用性 B.子类可以扩 ...
- 3.4 存储简单数据的利器——Preferences
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht ...
- PCB MS SQL 排序应用---SQL相邻数据区间值求解
其中一篇 博文中有写<PCB MS SQL 排序应用---相邻数据且相同合并处理>此篇有也应相用也同的技巧,实现相邻数据区间值求解 示例: 原数据:处理前 求出区间值:处理后 SQL 代码 ...
- LeetCode.5-最长回文子串(Longest Palindromic Substring)
这是悦乐书的第342次更新,第366篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第3题(顺位题号是5).给定一个字符串s,找到s中最长的回文子字符串. 您可以假设s ...
- HTML 14 JS事件
一 :什么是事件 发生的某一件事:触发特定的条件,完成某一项功能 二:学习的目的 在特定的条件下,完成特定的功能 条件满足的情况下,系统会自动执行 ( 回调 ) 绑定的方法 学习要点: 1.事件的两种 ...
- go之变量、指针、引用地址
一.值类型 定义和说明 定义:变量直接指向存在内存中的值,我们称之为值类型. 值类型的变量的值存储在栈中. 值类型 将一个变量赋值给另一个变量 被称为值拷贝 实例 package main impor ...
- WebApi里面路由机制的原理以及路由匹配的过程
1.WebApi服务启动之后,会执行全局配置文件Global.asax.cs的 protected void Application_Start(){GlobalConfiguration.Confi ...
- Django学习案例一(blog):六. 开发博客内容页面
目标:某条博客具体内容的展示,可返回博客主页面,可进行评论. 1. 编辑路由 一篇博客,要将其找出来,就需要有一个唯一的标识.Django 的模型中默认有一个唯一的且未自增长的主键,即 id 字段.我 ...
- js-事件处理(重点)
1:各种常用事件: 2:简单用法: <body onLoad="javascript:alert('hello world');" onUnload="javasc ...
- Java内存机制,内存地址
问题一:String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2); // ...