2019 CSP-J 初赛解析
题面,成绩不是真实水平,就挑重点说一说
T5
这是二分查找,属于是我的代码理解不太对
我的理解 #include<iostream> using namespace std; int p; int main(){ int l = 1,r = 100; cin >> p; int cnt = 0; while( l < r ){ cnt++; int mid = (l+r) / 2; if( mid == p ) break; if( mid < p ) l = mid+1; else r = mid-1; } cout << cnt; return 0; }
正确理解 #include<iostream> using namespace std; int p; int main(){ int l = 1,r = 100; cin >> p; int cnt = 0; while( l <= r ){ cnt++; int mid = (l+r) / 2; if( mid == p ) break; if( mid < p ) l = mid+1; else r = mid-1; } cout << cnt; return 0; }
当 p = 22 的时候,我的代码就不对了,22 本来应该是查 $7$ 次,但我的是 $6$ 次
出现这个问题的原因就是,我的算法不会考虑这个数到底是不是 22 ,
但现在的 mid 已经大于 21 而且 小于 23 了,我的算法会直接判断这个数就是 22,
实际上需要有一步筛查是判断当前到底是不是 22 ,
所以我的算法最终给的答案是 $6$,但实际上是 $7$
T7
这玩意好像只能枚举。。。
加油
最终枚举出来应该是:
袋子 1 2 3 4 方案数
0 0 0 0~4 5
0 0 1 1~3 3
0 0 2 2~3 2
0 1 1 1~3 3
0 1 2 2 1
0 2 2 2 1
1 1 1 1~2 2
1 1 2 2 1
最终最后是 $5 + 3 + 2 + 3 + 1 + 1 + 2 + 1 = 18$ 种
T11:
最好的跑法为:(依次代表周一到周天跑的公里数)
3 3 0 0 5 5 5
最终消耗的热量为:$ 2\times300+3\times600 = 2400 $ 千卡
T13:
每个车牌号可以理解成 ABCBA
很肯定的是,C 只能是 0、1、8 中的一个
然后 A 可以从 0、1、8、6、9 中取一个
B 跟 A 一样
所以一共有 $3\times5\times5$ 种车牌号
T16:
这个程序就是算出改变所有下标为字符串长度 n 的因子的a[i],
将其从小写字母转变为大写字母
当然这是最直观的感受,如果能大体记住ASCII码的话会发现不仅仅局限于小写字母
所以这里的 (1) 就可以得出答案了:错误
(2):正确,由于这个 i 枚举的是所有 n 的因子,所以 i 肯定是不能取到 0
(3):错误,以 n = 36 举例,按照原来的程序跑,i 可以取到 $12$ 和 $18$
但是改了以后 i 就只能取到 $6$ 了,所以很显然这个是不可以这么改动的
(4):正确,因为 $'A' < 'a'$ ,所以这个 if 循环压根就进不去
(5):6,因为 18 的因子一共只有 $6$ 个:$1、18、2、9、3、6$,要改变就变他们
(6):100000,很显然,其他选项的因子没那么多
T17:
(1):一开始觉得很有可能是:x = y = 0
刚才悟了半天才悟出来,这个 ++ans 的循环是从 $1$ 开始的。。。
剩下的不想再单独解释了,自己看老师推荐的题解吧。。。
附:LAN 局域网 WAN 广域网 MAN 城域网 LNA 低噪声放大器