\(\text{Analysis}\)

最大值最小很容易想到二分答案

然后用 \(dp\) 检查

设 \(f_i\) 表示当前行最后一个为 \(i\) 时最优情况最大空格数是否小于 \(mid\)

若 \(f_i = 1\) 可行

则存在一个 \(j\),令 \(j\) 为当前行开头

使得 \(f_{j-1} = 1\) 且 \(sum_i-sum_{j-1}+i-j \le w\) 且 \(sum_i - sum_{j-1}+mid \cdot (i-j) \ge w\)

第一条表示 \(j\) 之前最大空格数小于 \(mid\)

第二条表示 \(j\) 到 \(i\) 之间至少一个空格时能填入当前行

第三条表示 \(j\) 到 \(i\) 之间空格数都为 \(mid\) 时大于等于当前行

第三条能保证当前行最长空格数小于等于 \(mid\)

那么我们只要判断是否存在这样的 \(j(j \le i)\) 即可

观察第三条式子,发现满足第三条式子时 \(j\) 是连续的

再看第二条式子,在 \(j\) 满足第三条时 \(j\) 越大越容易满足

那么我们记录最优决策即可

\(i\) 变大后可以发现这个最优决策一定不早于上一个最优决策

\(\text{Code}\)

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std; const int N = 5e4 + 5;
int w, n, a[N], sum[N], f[N]; inline int check(int mid)
{
int p = 1, q = -1;
f[0] = 1;
for(int i = 1; i <= n; i++) f[i] = 0;
for(int i = 1; i <= n; i++)
{
while (p <= i && sum[i] - sum[p - 1] + mid * (i - p) >= w)
{
if (f[p - 1]) q = p;
++p;
}
f[i] = (q != -1 && sum[i] - sum[q - 1] + i - q <= w);
}
for(int i = n; i; i--)
if (f[i - 1] && sum[n] - sum[i - 1] + n - i <= w) return 1;
return 0;
} int main()
{
scanf("%d%d", &w, &n);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]), sum[i] = sum[i - 1] + a[i];
int ans, l = 1, r = w - 2, mid;
while (l <= r)
{
mid = (l + r) >> 1;
if (check(mid)) ans = mid, r = mid - 1;
else l = mid + 1;
}
printf("%d\n", ans);
}

JZOJ 3242. Spacing的更多相关文章

  1. 【BZOJ 3242】【UOJ #126】【CodeVS 3047】【NOI 2013】快餐店

    http://www.lydsy.com/JudgeOnline/problem.php?id=3242 http://uoj.ac/problem/126 http://codevs.cn/prob ...

  2. 【BZOJ-4692】Beautiful Spacing 二分答案 + 乱搞(DP?)

    4692: Beautiful Spacing Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 46  Solved: 21[Submit][Statu ...

  3. bzoj 3242: [Noi2013]快餐店 章鱼图

    3242: [Noi2013]快餐店 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 266  Solved: 140[Submit][Status] ...

  4. 【HDOJ】3242 List Operations

    注意以下数据:[] ++ [][] -- [1,2][1,2] ++ [][] ++ [1][2] ++ [][2,3] -- []结果是[][][1,2][1][2][2,3] /* 3242 */ ...

  5. UVALive 6190 Beautiful Spacing (2012 Tokyo regional)

    Beautiful Spacing 题意是给一个文本排版,求在满足题目所给要求的条件下,最长连续空格最小是多少. trick: 贪心地模拟是错的,至少无法证明正确性. 正解应该是二分答案+验证. 比较 ...

  6. uva live 6190 Beautiful Spacing (二分法+dp试 基于优化的独特性质)

    I - Beautiful Spacing Time Limit:8000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu ...

  7. (jzoj snow的追寻)线段树维护树的直径

    jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...

  8. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  9. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  10. [jzoj]5478.【NOIP2017提高组正式赛】列队

    Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校 ...

随机推荐

  1. Springboot整合thymeleaf报错whitelabel page

    1.SpringBootApplication未放在最外层 2.application.properties未配置spring.thymeleaf.check-template-location=tr ...

  2. 【每日一题】【归并排序/堆排序&虚拟头结点】148. 排序链表-211220/220217【出栈时不断容易产生环状链表!】

    给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 . 进阶: 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? 方法1:归并排序+使用辅助函数 ...

  3. webflux延迟队列逻辑更改过程记录

    title : webflux延迟队列逻辑更改过程记录 author : simonLee date : 2022/11/22 10:26 目录 webflux延迟队列逻辑更改过程记录 一.问题背景 ...

  4. Karmada多云多集群生产实践专场圆满落幕

    摘要:CNCF Karmada社区Cloud Native Days China 2022南京站成功举办. 本文分享自华为云社区<Karmada多云多集群生产实践专场圆满落幕|Cloud Nat ...

  5. Go DevOps大厂运维平台开发进阶实战营

    使用 Jenkinsfile 创建流水线已报名老男孩运维课,见底下评论.enkinsfile 是一个文本文件,它包含 Jenkins 流水线的定义,并被检入源代码控制仓库.Jenkinsfile 将整 ...

  6. STM32外部中断(EXTI)控制LED亮灭的代码

    led.c #include "led.h" void LED_Config(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2P ...

  7. week_4

    Andrew Ng 机器学习笔记---by Orangestar Week4_Neural Networks : Representation 1. Non-linear Hypotheses 当特征 ...

  8. Linux基础第五章 进程控制

    5.2 fork fork函数实现进程复制,类似于动物界的单性繁殖,fork函数直接创建一个子进程.这是Linux创建进程最常用的方法.在这一小节中,子进程概念指fork产生的进程,父进程指主动调用f ...

  9. 解决MySQL Connector/ODBC驱动无法安装Error1918

    1.问题描述 我在一台windows服务器上安装好mysql之后,再安装mysql的ODBC连接驱动时,报错如下: 2.解决方法 之所以出现安装失败是由于缺少Miscrosoft Visual C++ ...

  10. java线程基础知识整理

    目录 线程基本概念 1.java实现线程 2.线程的生命周期 3.线程常用的方法 3.1.sleep() 3.2.interrupt方法 3.3.stop方法 4.线程调度 4.1.常见的线程调度模型 ...