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

【bzoj1044】木棍分割

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=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<r){
        mid=(l+r)/2;
        if(chk(mid)) r=mid;
        else l=mid+1;
    }
    lim=r;
    for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
    for(int i=1;i<=n;i++){
        l=1;r=n;
        while(l<r){
            mid=(l+r)/2;
            if(s[i]-s[mid-1]<=lim) r=mid;
            else l=mid+1; 
        }
        p[i]=r; 
    }
    lst=0;now=1;
    for(int i=1;i<=n;i++) 
        if(s[i]<=lim) f[lst][i]=f[lst][i-1]+1;
        else f[lst][i]=f[lst][i-1];
    ans=(f[0][n]-f[0][n-1])%mod;
    for(int j=2;j<=m;j++){
        memset(f[now],false,sizeof(f[now]));
        for(int i=j,x;i<=n;i++){
            x=(f[lst][i-1]-f[lst][max(p[i]-2,0)])%mod;
            f[now][i]=(f[now][i-1]+x)%mod;
        }
        ans=(ans+f[now][n]-f[now][n-1]+mod)%mod;
        swap(now,lst);
    }
    cout<<lim<<" "<<ans;
    return 0;
}

 

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

相关文章:

  • promise(特点,项目中如何应用)
  • vux 获取后台数据
  • async,await(特点,项目中应用)
  • Horizon View 7 发布Win10桌面二:即时克隆桌面池配置
  • 系统恢复
  • generator(特点,项目应用)
  • Java日期类
  • 设计一个算法,判断玩家是否赢了井字游戏
  • ES6的数组方法详解(ES5新增)
  • 【转载】CSS 入门精要(四)
  • ES6新增数组方法
  • 心情随笔
  • includes()方法和indexOf()方法数组去重
  • KVM之网桥创建(ubuntu 环境)
  • orcale创建临时表空间,表空间,创建用户
  • [Vue CLI 3] 配置解析之 css.extract
  • 30天自制操作系统-2
  • 78. Subsets
  • dva中组件的懒加载
  • Electron入门介绍
  • hadoop集群管理系统搭建规划说明
  • JavaScript函数式编程(一)
  • java取消线程实例
  • learning koa2.x
  • MySQL主从复制读写分离及奇怪的问题
  • Objective-C 中关联引用的概念
  • Python socket服务器端、客户端传送信息
  • scrapy学习之路4(itemloder的使用)
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • 程序员该如何有效的找工作?
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • MPAndroidChart 教程:Y轴 YAxis
  • 我们雇佣了一只大猴子...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​2020 年大前端技术趋势解读
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (3)nginx 配置(nginx.conf)
  • (4.10~4.16)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (第二周)效能测试
  • (二)构建dubbo分布式平台-平台功能导图
  • (接口封装)
  • (三分钟)速览传统边缘检测算子
  • (一一四)第九章编程练习
  • (转)Linq学习笔记
  • (转)程序员技术练级攻略
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包