P8705 题解
思路分析
T1 跑步训练
一道数学题。
类似于蜗牛爬井的问题,不过这次是向下爬,且周期为两天。
我们可以参考蜗牛爬井的思路,用总长度(即初始体力)除以一个周期向下爬的长度(即600−300=300)得到变化周期数,即 10000÷300=33……100。
但是需要注意,最后一个周期需要单独分析,避免出现“本来爬到了顶端,但是又滑下去了”的情况。在前 32 个周期中,共爬了 32×(600−300)=9600,总共为 10000,则下一次就要爬 10000−9600=400,也就是 600400=32 分钟。因此总共要爬 32×2+32=6432=3194,即 3194×60=3880 秒。
T2 纪念日
这题要求我们计算【屏蔽词】成立的中午十二时到 99 周年庆十二时的一共包含多少分钟,由于都是十二时,所以其实就是要我们求出 【屏蔽词】的成立到九十九周年庆的日期总数。我们可以一年一年地去看一下。
【屏蔽词】成立于 1921 年 7 月 23 日,我们就可以一步一步倒推,计算 1921 年 7 月 23 日到 1922 年 7 月 23 日的总天数,得到 365 天,之后依此倒推至 2020 年 7 月 23 日,共 36160 天。但是【屏蔽词】的十二周年庆在一日。所以还要把天数减掉 22 天,得 36138 天。最后将其换算成分钟,也就是 36138×24×60=52038720。
T3 合并检测
预设民众数量为 10000,然后由题意,得 k 值对应的试剂盒数为 k10000+10000÷100×k=k10000+100×k。
数值太大不想算,于是令 t=k÷10,代回原式为 t1000+100×10×t=1000×(t+t1)。
即求 t+t1 得最小值,继续推。
t+t1=(t)2+(t1)2+2×t⋅t1−2×t⋅t1=(t−t1)2+2
显然 (t−t1)2≥0,所以当 t=t1,t 取 1 时,t+t1 最小。
代回原式得 k=10t=10。
T4 REPEAT
这题其实不用那么麻烦。
发现此题的代码格式跟 Python 语言类似。再打开讨论区中的文件一看,好家伙,这不就是 Python 稍微改改吗。
于是就可以进行替换,把 REPEAT (注意空格)替换成 for i in range(,把 : 替换成 ):,使其符合 Python 语言格式。最后在替换后的程序末尾加一句
print(A)
就可以了,运行输出即可。结果为 241830。
替换后的放在剪贴板里了,请自取。
T5 矩阵
DP 题。
假设我们按顺序填,即第一步填的数小于第二步,第二步小于第三步,以此类推。
记 f(i,j) 表示第一行填 i 个,第二行填 j 个时满足题意的填法个数。由题意, 1≤i,j≤1010,答案为 f(1010,1010)。
然后我们分析 f(i,j)。
首先,如果前一步填的是第一行,那么方案数为 f(i−1,j)。但需要注意,i≥1。同时,如果 i≤j,那么再往下填第一行时,填的数必然比下面的数大,矛盾。所以需要保证 i>j。显然,j≥0,所以此时 i>0,i≥1。所以,保证 i>j 即可,保证了 i 必然满足 i≥1。
如果前一步填的是第二行,那么方案数为 f(i,j−1)。同样需要保证 j≥1。
于是可以分析出如下递推式:
f(i,j)=⎩⎨⎧1f(i−1,j)f(i,j−1)f(i−1,j)+f(i,j−1)i=j=0i>j,j=0i≤j,j≥1i>j≥1
然后就可以写出代码计算,注意取模。算得最终答案为 1340。
五题答案都出来了,就可以直接填入模板提交了。但是貌似这题评分的答案搞错了
代码
#include<iostream>
using namespace std;
int main() {
string ans [] = {
"3880",
"52038720",
"10",
"241830",
"1340",
};
char T;
cin >> T;
cout << ans[T - 'A'] << endl;
return 0;
}