前言
4号省赛,到今天依旧没有一篇题解,索性自己写一个,当然不是标准答案,纯粹是个人的理解,可能会有错误,欢迎指正。个人认为这次省赛的题质量不错,都是能写的题,难度梯度也不错,最后一题可能偏简单了。
填空答案没保存,因此只写思路解法。
编程题稍后补上代码。
A 跑步训练
类似的问题很多,比如蜗牛爬树,爬井什么的。可以直接算,也可以编程模拟。需要注意的是最后一次跑步的一分钟剩余体力是400而不是100。
B 纪念日
没什么好说的,手算吧。听说excel里有函数可以直接得到天数。
C 合并检测
假设总体为1,合并检测需要消耗1/K盒试剂,其中有0.01的被感染者需要额外花费0.01*K盒试剂,即总共需要花费1/K+K/100盒试剂,根据基本不等式得K取10。
D REPEAT程序
可以写翻译程序,也可以取巧,替换文本改成代码,然后直接跑。
写翻译程序的话可以写一个dfs,每次发现repeat就起一个新的调用,传的参数我是用的缩进,以此得到优先级,缩进较长的需要优先计算得到结果。发现本行缩进小于参数时即可返回到上层。
给一个我写的翻译程序,基于dfs处理嵌套REPEAT
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 1000010;
string s[1005];
int i = 0;
int getp(string s)
{
int p = 0;
while(s[p] == ' ')p++;
return p;
}
int x = 0;
int dfs(int y)
{
int p = 0,v = 0;
while(x<i){
x++;
cout << s[x] << endl << x << ' ' << y << ' ' << v << endl;
p = getp(s[x]);
if(p<y){
x--;
return v;
}
if(s[x][p] == 'R')
{
v+=(s[x][p+7]-'0')*dfs(p+4);
}
else if(s[x][p] == 'A'){
v+=s[x][p+8]-'0';
}
}
return v;
}
int main()
{
freopen("prog.txt","r",stdin);
long long ans = 0;
//getline(cin,s[0]);
while(!cin.eof()){
getline(cin,s[i]);
i++;
}
ans = dfs(0