AHOI2024初中组个人题解(T3 80%)
T1 家庭作业
科普一个冷知识:int和char在cin里是分开输入的
所以,代码直接cin>>a>>b>>c>>d>>e;(int a,c,e;char b,d)就可以拿到三个数字
再者,用sscanf也可以实现格式输入,本处不再赘述
对于String模拟,可以通过叠加数位的方法实现字符串提取数字,本处提供一种写法:
string s;
cin>>s;
long long a = 0,b = 0,c = 0;//不记得范围了,开一下避免误导
int flag = 0;
for(auto i:s){
if(i=='+'||i=='=')flag++;
else{
if(flag == 0){
a = a*10+(i-'0');
}else if(flag == 1){
b = b*10+(i-'0');
}else c = c*10+(i-'0');
}
}
cout<<((a+b == c)?"Right!":"Wrong!");//如果使用sync加速则需要添加endl
T2 求和
争对本题,我们可以想简单一点,已知我们要求的是:
因为有着
1. 直接打表
估算可得
因此可以直接打表,打表程序此处忽略,设表
2. 循环结束
略去打表过程,直接开方
因为公式基本一样,略去
结束了么?
通过数据范围不难发现,会超时。
题目明确指出:
故此,可以将循环的起始点设为
T3 操作
本题解仅提供80分题解作为参考
读题,首先提出递归思路,可以得到约20分
介于递归时间太慢,我们不妨绘制一下递归树,会发现一台机器往往会启动很多遍,而每次所产生的价值是恒定的常量,所以可以记忆化出每个机器的价值二维数组,规定一维表示
设机器
由题可得:
当
当
设
设
调用
得到members数组后,按照K的顺序调用就行了
介于空间和时间约束,本思路只能实现80%的数据
T4
此处只是一个猜测,不能作为正解
我们不能直接通过分段来计算答案,因为会有重复的部分存在
设
先计算1,方便后面去重
去重后