浅浅水一下题解

浅浅做一下题解 c++选手不提供代码了 但是给大家找了提交平台)

题目一:

 

结论:若 (n%m+1)==0] 则先手必败,否则先手必胜

 

解释:首先假设n=m+1,这个时候无论先手第一次拿多少个,由于剩下的物品数量一定是小于等于m(一次所能取的最大石子数)的,所以后手一定可以一次拿完,所以这个时候先手必败

理解完n=m+1之后,拓展到n是m+1的倍数,同理,无论先手一次拿多少个物品,后手总是可以做出这样的策略:拿的物品和先手加在一起恰好是m+1(由于一次最多只能取m个,只需要一直保持至少需要取两次才能取完,这样就能保证最后只能由自己拿完,也就是让自己处于必胜的状态),这样若干回合之后一定又会回到我们说的第一种情况,先手必败。所以结论得证。

 

Ps:此题目为bash(巴什)博弈,有兴趣的可以百度一下

 

原题链接:https://leetcode-cn.com/problems/nim-game/

 

题目二:

 

 

 

根据题目中的例子:XXVII 可以转化为10+10+5+1+1=27。这是不考虑4、9、40、90、400、900的情况

把这类特殊情况看成-1+5、-1+10、-10+50、-10+100、-100+500、-100+1000,即对s[i+1](s[i]的下一个元素)进行判断,若s[i+1]>s[i],则减去s[i]对应的值,反之则加上s[i]对应的值。例如:XXIV 可以转化为10+10-1+5=24,XLVII可以转化为-10+50+5+1+1=47

思路明确之后写一个函数fun()转化单个字母,然后每次在循环里调用fun(s[i])以及fun(s[i+1])即可,有的语言可能需要判断边界,让循环到i<length-1就停止,因为最后一个元素s[length-1]直接加在sum里就行了

原题链接:https://leetcode-cn.com/problems/roman-to-integer/

posted @ 2022-02-22 11:03  阿枔  阅读(46)  评论(0编辑  收藏  举报