[Solved] 赵神牛的游戏(解题历程)
开始之前
这是我有史以来第一次做过最烦的题目(虽然这是入门级别的难度)。如果你已做过此题目并看到此篇题解,请跳过此篇,这是作者解题时的心路历程。
解题历程
第一次
审题 & 敲码
在还未完全读完整个题目的情况下,单看题目中所给的输入样本和输出样本。认为这道题目的输出只需要判断赵神牛能否打败 Boss 即可(是则输出为 1
,不能则输出 -1
)。
如第一个输入样例与第二个输入样例:
样例输入 #1
1
2
3
4 100 3 5000
20 1000
90 1
110 10000样例输出 #1
1 1样例输入 #2
1
2
3
4
5 50 4 10
60 100
70 1000
80 1000
90 0样例输出 #2
1 -1
随后,我就根据题目定义两个数组 spend_a
, spend_b
,分别存放了赵神牛的法力消耗与使用技能时的伤害值。于是就有了如下代码:
1 |
|
正当我信誓旦旦的写出了代码之后,提交到 OJ 评判,最终得到了大量的RE【Runtime Error】报错,甚至还有一两个TLE【Time Limit Exceeded】报错。
错误分析
之一:返回值不应当是任何数,只能为 0
翻看代码,发现 main()
函数中的返回值(return X
)中的 X
都被我定义成 -1
或 1
,导致出现 RE;
后来才知道,C 语言中的 main()
函数的返回值应当以 0
的方式正常退出即可。
之二:运行时间过长导致超出时间限制
解决此问题,最先应当解决的就是含有 for
与 while
循环的部分了;其次,
就是删除多余的循环。
第一次 Again
修改 & 敲码
经过了重重修改并反复提交之后,敲出了如下代码:
1 |
|
没错,这次的代码优化了许多。提交之后,虽然没有出现任何的RE和TLE报错,但出现了大量的 WA 报错。😂😂😂
很难想到,这究竟在哪里出了问题。
第二次
在解题路上摸爬滚打,终于找到原因
基于第一次的代码,反复修改,并没有找到原因。在经历了长达4个小时的头脑风暴后,我还是毅然决然地选择放弃(bushi)请教拥有ACM竞赛经验的同学。他大致看了我所写的代码,指出了许多的小问题。
在经历了多番的教导与纠错之下,我成功地推翻了之前的所有代码,重新审题并整理了一遍思路,反反复复地修改和优化代码。于是,就得到了相对最接近答案的代码:
1 |
|
其中上述代码作出的修改点有:
删除了
spend_a
和spend_b
这两个数组,因为不需要记录技能的消耗和伤害值,只需要判断是否可以打 boss 即可。在
for
循环中,判断是否可以打 boss 的条件由k / spend_a[i] * spend_b[i] >= n
改为b * (k / a) >= n
,因为k / spend_a[i] * spend_b[i]
可能会因为除数太小而溢出。在
for
循环中,判断是否可以打 boss 的条件由k > spend_a[i]
改为a == 0 && b > 0
,因为当a == 0 && b > 0
时,说明是k
无法消耗,但b
可以造成伤害,此时可以打 boss。
经历了漫长的解题抗争之后,才发现的小问题
正当以为终于可以解开这道题(解开了,又没完全解开)的时候,结果仍然是WA。我经历了无数次毫无意义的修改和调试,还是没能发现问题所在。
最后,同学仔细查看了我所写的代码之后,才发现了问题所在:没有仔细审题!!!
是的,这问题我从头到尾都没有注意过,就是输出多个技能序列时分隔的问题。我的代码中是用 ,
隔开,而题目中的输出要求是用空格隔开。
终于终于,我最后一次提交了正确的代码,终于全部通过了😭😭😭~~~~
- 标题: [Solved] 赵神牛的游戏(解题历程)
- 作者: CatIsNotFound
- 创建于 : 2024-09-12 19:14:09
- 更新于 : 2024-09-12 19:14:09
- 链接: https://catisnotfound.github.io/2024/09/Solved-赵神牛的游戏/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。