【题解】P8705 题解

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×2+23=6423=194332 \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 值对应的试剂盒数为 10000k+10000÷100×k=10000k+100×k\dfrac{10000}{k} + {10000 \div 100} \times k = \dfrac{10000}{k} + {100} \times k

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

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

t+1t=(t)2+(1t)2+2×t    1t2×t    1t=(t1t)2+2t + \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)={1i=j=0f(i1,j)i>j,j=0f(i,j1)ij,j1f(i1,j)+f(i,j1)i>j1f(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;
}
posted @ 2023-05-13 16:31  邻补角-SSA  阅读(8)  评论(0)    收藏  举报  来源