[Swift]LeetCode464. 我能赢吗 | Can I Win

In the "100 game," two players take turns adding, to a running total, any integer from 1..10. The player who first causes the running total to reach or exceed 100 wins.

What if we change the game so that players cannot re-use integers?

For example, two players might take turns drawing from a common pool of numbers of 1..15 without replacement until they reach a total >= 100.

Given an integer maxChoosableInteger and another integer desiredTotal, determine if the first player to move can force a win, assuming both players play optimally.

You can always assume that maxChoosableInteger will not be larger than 20 and desiredTotal will not be larger than 300.

Example

Input:
maxChoosableInteger = 10
desiredTotal = 11

Output:
false

Explanation:
No matter which integer the first player choose, the first player will lose.
The first player can choose an integer from 1 up to 10.
If the first player choose 1, the second player can only choose integers from 2 up to 10.
The second player will win by choosing 10 and get a total = 11, which is >= desiredTotal.
Same with other integers chosen by the first player, the second player will always win.


在 "100 game" 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和达到 100 的玩家,即为胜者。

如果我们将游戏规则改为 “玩家不能重复使用整数” 呢?

例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。

给定一个整数 maxChoosableInteger (整数池中可选择的最大数)和另一个整数 desiredTotal(累计和),判断先出手的玩家是否能稳赢(假设两位玩家游戏时都表现最佳)?

你可以假设 maxChoosableInteger 不会大于 20, desiredTotal 不会大于 300。

示例:

输入:
maxChoosableInteger = 10
desiredTotal = 11

输出:
false

解释:
无论第一个玩家选择哪个整数,他都会失败。
第一个玩家可以选择从 1 到 10 的整数。
如果第一个玩家选择 1,那么第二个玩家只能选择从 2 到 10 的整数。
第二个玩家可以通过选择整数 10(那么累积和为 11 >= desiredTotal),从而取得胜利.
同样地,第一个玩家选择任意其他整数,第二个玩家都会赢。

288ms
 1 class Solution {
 2     func canIWin(_ maxChoosableInteger: Int, _ desiredTotal: Int) -> Bool {
 3         if maxChoosableInteger >= desiredTotal {return true}
 4         if maxChoosableInteger * (maxChoosableInteger + 1) / 2 < desiredTotal
 5         {
 6             return false
 7         }
 8         var m:[Int:Bool] = [Int:Bool]()
 9         return canWin(maxChoosableInteger, desiredTotal, 0, &m)
10     }
11
12     func canWin(_ length:Int,_ total:Int,_ used:Int,_ m:inout [Int:Bool]) -> Bool
13     {
14         if m[used] != nil
15         {
16             return m[used]!
17         }
18         for i in 0..<length
19         {
20             var cur:Int = (1 << i)
21             if (cur & used) == 0
22             {
23                 if total <= i + 1 || !canWin(length, total - (i + 1), cur | used, &m)
24                 {
25                     m[used] = true
26                     return true
27                 }
28             }
29         }
30         m[used] = false
31         return false
32     }
33 }


7240ms

 1 class Solution {
 2     func canIWin(_ maxChoosableInteger: Int, _ desiredTotal: Int) -> Bool {
 3         if desiredTotal <= 0 {
 4             return true
 5         }
 6         if (1 + maxChoosableInteger) * maxChoosableInteger / 2 < desiredTotal {
 7             return false
 8         }
 9         var state = [Int](repeating: 0, count: maxChoosableInteger + 1)
10         var map = [String : Bool]()
11         return helper(maxChoosableInteger, desiredTotal, &state, &map)
12     }
13     private func helper(_ maxChoosableInteger: Int, _ desiredTotal: Int, _ state: inout [Int], _ map: inout [String : Bool]) -> Bool {
14         let currState = state.description
15         if map[currState] == nil {
16             for i in 1..<state.count {
17                 if state[i] == 0 {
18                     state[i] = 1
19                     if desiredTotal - i <= 0 || !helper(maxChoosableInteger, desiredTotal - i, &state, &map) {
20                         map[currState] = true
21                         state[i] = 0
22                         return true
23                     }
24                     state[i] = 0
25                 }
26             }
27             map[currState] = false
28         }
29         return map[currState]!
30     }
31 }

原文地址:https://www.cnblogs.com/strengthen/p/10345832.html

时间: 2024-10-11 03:39:55

[Swift]LeetCode464. 我能赢吗 | Can I Win的相关文章

Swift给每个开发者赢取500万的机会

[导语] Swift的横空出世,很多有想法的人已经发现其中的蕴含的巨大商机,而很多新手却只是云里雾里,只知道大家最近讨论Swift很欢乐.内行看门道,外行看热闹,说的就是这个理.如果你能把swift用得好,下一个千万富翁就是你! 一.Swift给技术论坛机会 开发者都知道IOS技术论坛,国内算CocoaChina老大,而Android的话当初是eoe论坛,现在开发者比较分散,Apkbus.eoe.以及各个手机厂商上的开发者论坛比如华为.小米也有一些人,还有另外一部分开发者不怎么逛论坛,专门在CS

Swift给每个开发者赢取500万的机会!不看一生后悔。

[导语] Swift的横空出世,很多有想法的人已经发现其中的蕴含的巨大商机,而很多新手却只是云里雾里,只知道大家最近讨论Swift很欢乐.内行看门道,外行看热闹,说的就是这个理.如果你能把swift用得好,下一个千万富翁就是你!一.Swift给技术论坛机会 开发者都知道IOS技术论坛,国内算CocoaChina老大,而Android的话当初是eoe论坛,现在开发者比较分散,Apkbus.eoe.以及 各个手机厂商上的开发者论坛比如华为.小米也有一些人,还有另外一部分开发者不怎么逛论坛,专门在CS

『HTML5实现人工智能』小游戏《井字棋》发布,据说IQ上200才能赢【算法&amp;代码讲解+资源打包下载】

一,什么是TicTacToe(井字棋) 本游戏为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿童欢迎.可能我说了半天,对它名字不熟悉的朋友也不懂我在说神马.那没关系,我就引用Wiki(维基百科)的介绍作为大家对它名字的认识,顺便也勾起我们儿时的回忆: 井字棋,大陆.台湾又称为井字游戏.圈圈叉叉:另外也有打井游戏.OX棋的称呼,香港多称井字过三关.过三关,是种纸笔游戏.两个玩家,一个打圈(O),一个打

Javascript常用的设计模式详解

阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javascript中的策略模式 九:Javascript中理解发布--订阅模式 十:理解中介者模式 回到顶部 一:理解工厂模式 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式. 简单的工厂模式可以理解为解决多个相似的问题;这也是她的优点;比如如下代码: function CreateP

技术管理—管理书籍推荐

技术出身,考虑接触下管理方面的知识.也许管理真的适合你,角色认知?角色实践?角色胜任!最后爱上它! 我最依赖的宝典--高效能人士的七个习惯 该书的亮点是讲究从内而外全面造就自己. 习惯一:积极主动(BE PROACTIVE) 习惯二:以终为始(BEGIN WITH THE END IN MIND) 习惯三:要事第一(PUT FIRST THINGS FIRST) 习惯四:双赢思维(THINK WIN/WIN) 习惯五:知彼解己(SEEK FIRST TOUNDERSTAND,THEN UNDER

java编程

Java编程:五子棋游戏源代码 import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; import java.io.PrintStream; import javax.swing.JComponent; import javax.swing.JPanel; /* *main方法创建了ChessFrame类的一个实例对象(cf), *并启动屏幕显示显示该实例对象. **/ pu

乌镇互联网大会——中国最成功的商人花一辈子才悟到的道理(转自知乎)

今天在知乎看到一个不错东西,分享到这给大家看看. 首届世界互联网大会正在浙江乌镇举行,「世界互联网大会」,听起来就吓人.开会的阵容也确实很吓人(以下排名以神秘算法为序)—— 马云.马化腾.李彦宏.雷军.刘强东.张朝阳.周鸿祎这些大佬都去了. 而且他们没打起来. 不过嘴上的比拼肯定不能少啦,比如刘强东说完:我们要解决的是,中国社会的这种商业.成本还有效率问题.马云在发言中就来了一句: 「而阿里巴巴要做的是什么呢?阿里巴巴是要培养更多的京东.」 听完全场爆笑,李彦宏也笑着看了一眼刘强东. 不过马云还

马云:眼光有多远 未来就有多远【2014世界互联网大会】

本文转自:http://tech.sina.com.cn/i/2014-11-20/detail-icesifvw7861547.shtml 阿里巴巴董事局主席马云 新浪科技讯 11月20日上午消息,首届世界互联网大会昨日在浙江乌镇开幕,大会为期三天,以“互联互通,共享共治”为主题.来自100多个国家的上千名政经领袖和互联网大佬将在此共议全球化背景下互联网发展和未来趋势. 在20日上午的“跨境电子商务和全球经济一体化”分论坛上,阿里巴巴董事局主席马云与会并发表演讲指出,生意越来越难做,关键是你

乒乓球与羽毛球不同发球规则下选手的胜率——概率论+程序分析

1.当第一个选手具有发球权,如果第一个选手赢了,第一个选手得一分,如果第一个选手输了,第二个选手具有发球权,而不会得分 2.赢的人发球 3.每两球换一个人发球 每种情况分是否有两分拉锯战,共六种情况,其中第一种情况对发发球者有较大的优势:第二种情况有优势,但优势不大:第三种情况(赢t球胜),当t为奇数,且有拉锯战时,两选手胜率相同. 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 double f[10