博客
关于我
Codeforces Global Round 13
阅读量:406 次
发布时间:2019-03-05

本文共 879 字,大约阅读时间需要 2 分钟。

为了解决这个问题,我们需要找到将所有点的值变为1所需的最少起跳次数。每次起跳会影响后续的点,具体来说,起跳点的值减少一次,并且起跳会影响后续点的跳跃次数。

方法思路

我们可以使用动态规划来解决这个问题。具体步骤如下:

  • 初始化数组:创建一个数组 b,其中 b[i] 表示点 i 被跳跃的次数。
  • 填充数组:遍历每个点 i,计算 b[i]。根据前点的跳跃次数和当前点的初始值,确保 b[i] 不超过当前点的初始值,并且不低于前点的跳跃次数加上某个值。
  • 累加结果:将所有点的跳跃次数累加,得到最少的起跳次数。
  • 解决代码

    #include 
    #include
    void solve() { int n; std::vector
    a(n + 1); std::vector
    b(n + 1); b[0] = 0; for (int i = 1; i <= n; ++i) { b[i] = std::max(b[i - 1], a[i] - (b[i - 1] - 1)); if (b[i] > a[i]) { b[i] = a[i]; } } int ans = 0; for (int i = 1; i <= n; ++i) { ans += b[i]; } std::cout << ans << '\n';}

    代码解释

  • 初始化:读取输入并初始化数组 ab
  • 动态规划填充:遍历每个点 i,计算 b[i]。使用 std::max 确保 b[i] 不低于前点的跳跃次数加上某个值,并使用 std::min 确保 b[i] 不超过当前点的初始值。
  • 计算结果:将所有点的跳跃次数累加,得到最少的起跳次数,并输出结果。
  • 这种方法确保了每个点的跳跃次数被合理计算,避免了不必要的跳跃,从而最小化了总的起跳次数。

    转载地址:http://dkwzz.baihongyu.com/

    你可能感兴趣的文章
    poj2398
    查看>>
    poj2478欧拉函数
    查看>>
    poj2546
    查看>>
    POJ2728 Desert King
    查看>>
    POJ2794 Double Patience[离散概率 状压DP]
    查看>>
    poj2828(线段树查找序列第k小的值)
    查看>>
    POJ2891:Strange Way to Express Integers——题解
    查看>>
    poj3045 Cow Acrobats(二分最大化最小值)
    查看>>
    poj3061 Subsequence(尺取法)
    查看>>
    poj3074 DLX精确覆盖
    查看>>
    poj3252(组合数)
    查看>>
    Qt笔记——QToolBox开发简易QQ聊天界面
    查看>>
    poj3307
    查看>>
    Qt笔记——QString与隐式共享、MVC架构
    查看>>
    Qt笔记——QSemaphore处理生产者/消费者模式
    查看>>
    Qt笔记——QMutex&QWaitCondition处理生产者消费者模式
    查看>>
    Qt笔记——QLable+QPixmap图片缩放踩坑
    查看>>
    Qt笔记——foreach与forever
    查看>>
    QT程序怎么挪到Linux下,linux+Qt程序如何打包发布
    查看>>
    Qt知识:视图框架QGraphicsWidget详解
    查看>>