1 条题解

  • 0
    @ 2025-8-24 21:17:24

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 览遍千秋
    将伤与泪汇成力化作拳

    搬运于2025-08-24 21:17:23,当前版本为作者最后更新于2025-02-16 19:05:30,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    Source and Knowledge

    2025 年 2 月语言月赛,由洛谷网校提供。

    考察简单数组。


    文字题解

    根据题目的要求,我们可以改变连续 kk 场比赛的得分。

    枚举这 kk 场比赛的起始场次 ii,那么,终止的场次是 i+k1i+k-1。下面的代码,外层循环 ii 枚举起始场次,jj 枚举场次。

    for (int i = 1; i + k - 1 <= n; i++) {
        for (int j = i; j <= i + k - 1; j++) {
            a[j] -= 2;
        }
        // something else here
    }
    

    对于 ii+k1i\sim i+k-1 范围内的每一场比赛 jj,我们修改其比分,将 a[j]a[j] 减去 22。由于另外一人的得分为 99a[j]99-a[j],将 a[j]a[j] 减去 22 的同时,自然的完成了另一人得分增加 22 的过程。

    随后,我们枚举全部的比赛,统计粉边铅球可以赢的比赛数目。如果粉边铅球赢的比赛数目更多,则统计一次答案。

    int win = 0;
    for (int j = 1; j <= n; j++) {
        if (99 - a[j] > a[j]) win++;
    }
    if (win > n - win) ans++;
    

    需要注意的是,在进行下一次比分修改时,需要撤销本次修改的比分。每一次比分修改是独立的。

    综上,可以得到核心代码如下。

    for (int i = 1; i + k - 1 <= n; i++) {
        for (int j = i; j <= i + k - 1; j++) {
            a[j] -= 2;
        }
        int win = 0;
        for (int j = 1; j <= n; j++) {
            if (99 - a[j] > a[j]) win++;
        }
        if (win > n - win) ans++;
        for (int j = i; j <= i + k - 1; j++) {
            a[j] += 2;
        }
    }
    
    • 1

    [语言月赛 202502] 本俗妙手不如举手

    信息

    ID
    11417
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者