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

P2511 [HAOI2008] 木棍分割

解题思路

这个问题分为两个部分:

第一部分:求最大段长度的最小值(二分答案)

  • 使用二分查找确定最小的最大段长度

  • 对于每个候选值mid,用贪心检查是否能分成最多m+1段(切m刀)

  • 检查时尽量把木棍合并,直到超过mid就开新段

第二部分:求方案数(动态规划)

  • f[j]表示考虑前j根木棍,当前切割段的方案数

  • lef[i]表示以i结尾时,能够满足最大段长度≤ans的最左切割位置

  • 使用前缀和优化DP转移,将O(n²)优化到O(nm)

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N = 2e5 + 10,inf = 0x3f3f3f3f;
    ll n,m,a[N];
    ll L,R;
    ll s[N],f[N],lef[N],sum,mod = 10007;// 检查函数:判断是否能在最大段长度不超过mid的情况下分成不超过m+1段
    bool check(ll mid){ll len = 0,cnt = 1;  // len:当前段长度, cnt:段数计数(初始为1段)for(int i = 1; i <= n; i++){if(len + a[i] > mid){  // 如果当前段加上这根木棍会超过midcnt++;            // 需要新开一段len = a[i];       // 新段从当前木棍开始
            }else len += a[i];     // 否则继续累加到当前段
        }// 判断段数是否不超过m+1(切m刀分成m+1段)if(cnt <= m + 1) return 1;else return 0;
    }int main()
    {cin >> n >> m;// 输入数据并初始化二分边界for(int i = 1; i <= n; i++) scanf("%lld",&a[i]),R += a[i],L = max(L,a[i]);ll ans;// 二分查找:找到最小的最大段长度while(L <= R){ll mid = (L + R) >> 1;if(check(mid)){      // 如果mid可行,尝试更小的值ans = mid;R = mid - 1;}else L = mid + 1;   // 否则需要更大的值
        }// 预处理:计算前缀和和lef数组int top = 0;for(int i = 1; i <= n; i++){a[i] += a[i - 1];   // 将a数组转为前缀和数组// 找到满足a[i]-a[top]<=ans的最小topwhile(a[i] - a[top] > ans) top++;lef[i] = top;       // 记录位置i对应的最左可行切割点
        }// DP计算方案数fill(s,s + 1 + n,1);    // 初始化前缀和数组,s[0]=1表示空序列方案数为1// 注意:循环m+1次,因为可以切0刀到m刀(共m+1种情况)for(int i = 1; i <= m + 1; i++){// 计算f[j]: 前j根木棍,当前切割段的方案数for(int j = 1; j <= n; j++) f[j] = (s[j - 1] - s[lef[j] - 1]) % mod;// 更新前缀和数组s,用于下一轮DPs[0] = 0;for(int j = 1; j <= n; j++) s[j] = f[j] + s[j - 1];// 累加当前切割次数下,分割到第n根木棍的方案数sum = (f[n] + sum) % mod;}cout << ans << " " << sum << endl;return 0;
    }

     

http://www.gsyq.cn/news/55229.html

相关文章:

  • MySQL高级运维核心技术:事务处理、安全管理与性能优化
  • 图文矩阵系统厂家综合测评推荐榜,抖音短视频矩阵/ai排名/短视频矩阵/ai排行榜/ai数字人矩阵/图文矩阵厂家推荐
  • nacos单机版安装
  • linux top命令配置重置还原
  • 第九章 顺序容器
  • 2025年岩棉板厂家权威推荐榜单:防排烟岩棉板/岩棉条/岩棉隔离带源头厂家精选
  • [完结13章]AI 编程必备 - 零基础 系统化学Python
  • 2025MathorCup大信息竞赛A题B题选题建议与分析,思路模型
  • SSH 客户端 MobarXterm 安装和使用笔记
  • 机器学习之决策树模型
  • 251119D. mod
  • 西门子MES已有质量模块,为何再斥资收购QMS?
  • 2025 年 11 月聚氨酯厂家推荐排行榜,聚氨酯组合料/黑白料/AB料/管道料/发泡剂,外墙/冷库聚氨酯保温材料公司精选
  • 2025安庆一对一家教机构推荐:五大辅导机构测评排行榜,综合实力全解析!
  • 邵阳一对一家教辅导机构推荐:2025年最新权威榜,全学段提分不踩坑
  • 2025马鞍山一对一家教机构推荐:五大辅导机构测评排行榜,综合实力全解析!
  • 马鞍山一对一辅导机构权威排行榜推荐:2025家教机构穿透式测评!
  • TalentsAI ——专家级大模型数据标注平台
  • 锁:lock、Monitor、SemaphoreSlim
  • 完整教程:ASP.NET MVC 前置基础:宿主环境 HttpRuntime 管道,从部署到流程拆透(附避坑指南)
  • 08_TCP服务器:一请求一线程 epoll
  • STM32学习(MCU控制)(USART) - 指南
  • NET 8 使用 rabbitMQ
  • 水波紋特效
  • 《说苑敬慎》中的故事
  • 实用指南:[从零开始面试算法] (04/100) LeetCode 136. 只出现一次的数字:哈希表与位运算的巅峰对决
  • [UOI2023] An Array and Partial Sums 题解(未完)
  • 关于某个视频的一点点想法
  • akm SharedWorker
  • Why did Sanminism fail?