全部评论 29

  • 3

    5天前 来自 广东

    8
  • 2

    5天前 来自 广东

    8
  • 1

    6天前 来自 浙江

    8
  • 1

    6天前 来自 浙江

    4
  • 666

    5天前 来自 浙江

    3
  • 1

    5天前 来自 浙江

    3
  • 。

    19小时前 来自 浙江

    2
  • 1

    6天前 来自 浙江

    2
  • 1

    6天前 来自 浙江

    2
  • 。

    19小时前 来自 浙江

    1
  • 。

    19小时前 来自 浙江

    1
  • 。

    19小时前 来自 浙江

    1
  • jrttttttttttttttttttttttttttttttttt
    官方题解 | 巅峰赛#39题解
    userId_undefined
    Yuilice
    2026-10-14 10:23:20

    发布于:浙江

    168
    阅读
    25
    回复
    30
    点赞
    导语
    久违的巅峰赛,这次巅峰赛是以Dp和状压作为压轴的,毕竟许多朋友的状压熟练度还有待提升 (笑) 。

    以下为题解

    目录
    题目编号 题目标题 难度
    T1 Yuilice 的手工套装 入门
    T2 Yuilice 的相册整理 普及-
    T3 Yuilice 的分批冲印 普及/提高-
    T4 Yuilice 的打印店 普及+/提高
    T5 Yuilice 的小区接送 普及+/提高
    T6 Yuilice 的共用设备 普及+/提高
    Yuilice 的手工套装
    题意简述
    有 a 张大卡纸和 b 张小卡纸,每套手工套装需要一张大卡纸和一张小卡纸。可以把一张大卡纸剪成两张小卡纸,剪过的卡纸不能再当大卡纸使用。求最多能制作多少套。

    样例 1 中输入为 5,0。剪开两张大卡纸后,还剩 3 张大卡纸和 4 张小卡纸,因此可以制作 3 套。样例 2 中小卡纸已经足够,直接使用 2 张大卡纸即可。

    解题思路
    解题方法
    设剪开 x 张大卡纸,其中 0≤x≤a。操作结束后:

    大卡纸有 a−x 张;
    小卡纸有 b+2x 张。
    每套需要两种卡纸各一张,所以固定 x 时最多制作

    min(a−x,b+2x)

    套。枚举全部合法的 x,取最大值即可。

    读入 a,b,答案初始为 0。
    枚举 x=0,1,…,a。
    计算当前值 min(a−x,b+2x),更新答案。
    任意一种制作方案都会剪开某个合法数量 x 的大卡纸,因此一定会被程序枚举。固定 x 后,套数不能超过剩余大卡纸数量,也不能超过小卡纸数量,所以最多是 min(a−x,b+2x);取出这么多张两种卡纸后可以逐套配对,说明这个上限能够达到。

    程序枚举了所有可能的 x,并取其中最大值,所以得到的正是最优答案。

    时间复杂度为 O(a),额外空间复杂度为 O(1)。因为 a,b≤10
    6
    ,中间数量不超过 3×10
    6
    ,使用 int 足够。

    剪纸后要同时减少大卡纸、增加小卡纸。
    可以一次都不剪,x=0 必须被枚举。
    不能直接输出 min(a,b),因为剪纸可能增加可制作套数。
    部分分
    测试点 1~10(无额外限制):枚举裁剪数量即可获得满分。
    参考代码
    #include <bits/stdc++.h>
    using namespace std;
    int main() {
    int a, b;
    cin >> a >> b;
    int ans = 0;
    for (int x = 0; x <= a; x++) {
    // 剪开 x 张后,两种卡纸中较少的一种决定套数。
    int now = min(a - x, b + 2 * x);
    ans = max(ans, now);
    }
    cout << ans << '\n';
    return 0;
    }
    Yuilice 的相册整理
    题意简述
    有 n 张照片,日期为 a
    1
    ​
    ,a
    2
    ​
    ,…,a
    n
    ​
    。如果 a
    i
    ​

    a
    i+1
    ​
    ,则位置 i 有一处日期回退。可以不操作,也可以选择一段恰好包含 k 张照片的连续区间反转一次,求最少回退数。

    反转只改变顺序,不改变日期;日期相等不算回退。

    解题思路
    解题方法
    先记原序列的回退总数为 B,考虑反转区间 [l,r],其中 r=l+k−1。

    区间内部的相邻关系会全部反向:原来严格上升的关系会变成回退,原来的回退会消失,相等关系仍然不计数。设区间内部严格上升数为 U、回退数为 D,内部部分反转后对答案的贡献就是 U−D。

    区间外的关系都不变,只需要检查最多两条连接边:

    如果 l>1,原来的 (a
    l−1
    ​
    ,a
    l
    ​
    ) 变成 (a
    l−1
    ​
    ,a
    r
    ​
    );
    如果 r<n,原来的 (a
    r
    ​
    ,a
    r+1
    ​
    ) 变成 (a
    l
    ​
    ,a
    r+1
    ​
    )。
    这样,每个区间都能在 O(1) 时间内算出答案。区间右移一格时,内部关系只删除最左边一对、加入最右边一对,因此 U,D 可以滑动维护。

    统计原序列的回退数 B,并令答案初始为 B,表示可以不操作。
    统计第一个长度为 k 的区间内部的上升数 U 和回退数 D。
    枚举区间左端点,用 B+U−D 加上两侧连接的变化量得到当前答案。
    窗口右移时删除离开窗口的相邻关系,加入新进入窗口的相邻关系。
    输出所有方案中的最小值。
    把原序列的相邻关系分为三类

    20小时前 来自 浙江

    1
  • fd

    20小时前 来自 浙江

    1
  • 1、

    2天前 来自 广东

    1
  • 。

    15小时前 来自 浙江

    0
  • 。

    19小时前 来自 浙江

    0
  • 1

    2天前 来自 浙江

    0
  • 1

    2天前 来自 浙江

    0

热门讨论