1 条题解

  • 0
    @ 2025-8-24 22:41:37

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar liangbob
    我们生活在大地上,但我们的梦想超越天空。

    搬运于2025-08-24 22:41:37,当前版本为作者最后更新于2023-05-13 16:31:01,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    P8705 题解

    思路分析

    T1 跑步训练

    一道数学题。

    类似于蜗牛爬井的问题,不过这次是向下爬,且周期为两天。

    我们可以参考蜗牛爬井的思路,用总长度(即初始体力)除以一个周期向下爬的长度(即600300=300600-300=300)得到变化周期数,即 10000÷300=3310010000 \div 300 = 33 \ldots \ldots 100

    但是需要注意,最后一个周期需要单独分析,避免出现“本来爬到了顶端,但是又滑下去了”的情况。在前 3232 个周期中,共爬了 32×(600300)=960032 \times (600-300) = 9600,总共为 1000010000,则下一次就要爬 100009600=40010000-9600=400,也就是 400600=23\dfrac{400}{600} = \dfrac{2}{3} 分钟。因此总共要爬 $32 \times 2 + \dfrac{2}{3} = 64 \dfrac{2}{3} = \dfrac{194}{3}$,即 1943×60=3880\dfrac{194}{3} \times 60 = 3880 秒。

    T2 纪念日

    这题要求我们计算【屏蔽词】成立的中午十二时到 9999 周年庆十二时的一共包含多少分钟,由于都是十二时,所以其实就是要我们求出 【屏蔽词】的成立到九十九周年庆的日期总数。我们可以一年一年地去看一下。

    【屏蔽词】成立于 19211921772323 日,我们就可以一步一步倒推,计算 19211921772323 日到 19221922772323 日的总天数,得到 365365 天,之后依此倒推至 20202020772323 日,共 3616036160 天。但是【屏蔽词】的十二周年庆在一日。所以还要把天数减掉 2222 天,得 3613836138 天。最后将其换算成分钟,也就是 36138×24×60=5203872036138 \times 24 \times 60 = 52038720

    T3 合并检测

    预设民众数量为 1000010000,然后由题意,得 kk 值对应的试剂盒数为 $\dfrac{10000}{k} + {10000 \div 100} \times k = \dfrac{10000}{k} + {100} \times k$。

    数值太大不想算,于是令 t=k÷10t = k \div 10,代回原式为 $\dfrac{1000}{t} + 100 \times 10 \times t = 1000\times(t + \dfrac{1}{t})$。

    即求 t+1tt + \dfrac{1}{t} 得最小值,继续推。

    $$t + \dfrac{1}{t} = (\sqrt{t})^2 + (\sqrt{\dfrac{1}{t}})^2 + 2 \times \sqrt{t\; \cdot \; \dfrac{1}{t}} - 2 \times \sqrt{t\; \cdot \; \dfrac{1}{t}} = (\sqrt{t} - \sqrt{\dfrac{1}{t}})^2 + 2 $$

    显然 (t1t)20(\sqrt{t} - \sqrt{\dfrac{1}{t}})^2 \ge 0,所以当 t=1t\sqrt{t} = \sqrt{\dfrac{1}{t}}tt11 时,t+1tt + \dfrac{1}{t} 最小。

    代回原式得 k=10t=10k = 10t = 10

    T4 REPEAT

    这题其实不用那么麻烦。

    发现此题的代码格式跟 Python 语言类似。再打开讨论区中的文件一看,好家伙,这不就是 Python 稍微改改吗。

    于是就可以进行替换,把 REPEAT (注意空格)替换成 for i in range(,把 : 替换成 ):,使其符合 Python 语言格式。最后在替换后的程序末尾加一句

    print(A)
    

    就可以了,运行输出即可。结果为 241830241830

    替换后的放在剪贴板里了,请自取。

    T5 矩阵

    DP 题。

    假设我们按顺序填,即第一步填的数小于第二步,第二步小于第三步,以此类推。

    f(i,j)f(i,j) 表示第一行填 ii 个,第二行填 jj 个时满足题意的填法个数。由题意, 1i,j10101 \leq i, j \leq 1010,答案为 f(1010,1010)f(1010,1010)

    然后我们分析 f(i,j)f(i,j)

    首先,如果前一步填的是第一行,那么方案数为 f(i1,j)f(i-1,j)。但需要注意,i1i \geq 1。同时,如果 iji \leq j,那么再往下填第一行时,填的数必然比下面的数大,矛盾。所以需要保证 i>ji > j。显然,j0j \geq 0,所以此时 i>0i > 0i1i \geq 1。所以,保证 i>ji > j 即可,保证了 ii 必然满足 i1i \geq 1

    如果前一步填的是第二行,那么方案数为 f(i,j1)f(i,j-1)。同样需要保证 j1j \geq 1

    于是可以分析出如下递推式:

    $$f(i,j)=\begin{cases}1&i=j=0\\f(i-1,j)&i > j,j= 0\\f(i,j-1)&i \leq j,j \geq 1\\f(i-1,j)+f(i,j-1)&i > j \geq 1\end{cases} $$

    然后就可以写出代码计算,注意取模。算得最终答案为 13401340

    五题答案都出来了,就可以直接填入模板提交了。但是貌似这题评分的答案搞错了

    代码

    #include<iostream>
    using namespace std;
    int main() {
        string ans [] = {
            "3880", // 双引号中替换为 A 题的答案
            "52038720", // 双引号中替换为 B 题的答案
            "10", // 双引号中替换为 C 题的答案
            "241830", // 双引号中替换为 D 题的答案
            "1340", // 双引号中替换为 E 题的答案
        };
        char T;
        cin >> T;
        cout << ans[T - 'A'] << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    8079
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者