CF1579G - Minimal Coverage(DP,贪心,二分)

CF1579G - Minimal Coverage

题目描述

  • 给出 n n n 条线段,第 i i i 条线段长度为 a i a_i ai
  • 现在要求将所有线段按照给出的顺序依次放置在一个无限长的数轴上
    并且满足当前放置线段的起点等于上一条放置线段的终点
  • 初始线段起点为 0 0 0
  • 现在要求所有线段的覆盖的长度(即线段的并)最短
  • t t t 组数据, 1 ≤ t ≤ 1000 1 \leq t \leq 1000 1t1000,保证 ∑ n ≤ 1 0 4 \sum n \leq 10^4 n104
  • 对于每组数据 1 ≤ a i ≤ 1000 , 1 ≤ n ≤ 1 0 4 1 \leq a_i \leq 1000,1 \leq n \leq 10^4 1ai1000,1n104

分析

很不错的一道题,虽然没有多难,但是题目很多做法和细节都值得思考

做法1:DP

首先可以把所有线段想象成若干次跳跃,那么可以想到以数轴长度作为状态转移的DP单次转移都是 O ( 1 ) O(1) O(1) 的。

具体看题目要求,我们要求线段的覆盖距离最短,那么需要记录一个到达过的最左距离 L L L 和最右距离 R R R ,和当前在位置 p o s pos pos,但是显然我们受数据限制没法开这么多维记录。

思考这个问题,我们首先可以把跳跃的范围缩短到 [ − m a x { a i } , m a x { a i } ] [-max \{a_i \},max \{a_i \}] [max{ ai},max{ ai}],这里不做严格证明,并且我不知道怎么证在下述算法运行时这个结论成立。

简单的论述一下:假设我们这次跳跃的位置的绝对值第一次超过 m a x { a i } max \{a_i \} max{ ai},那么上一次的位置处在数轴相同一侧 [ 1 , m a x { a i } ) [1,max \{a_i \}) [1,max{ ai}) 的位置。那么如果我们往相反一侧跳跃,就不会超过上述范围,因此我们可以有效的把长度压缩至 [ − 1000 , 1000 ] [-1000,1000]

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值