硬币排成线-LintCode
描述
有 n 个硬币排成一条线。两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。
请判定 先手玩家 必胜还是必败?
题目链接:https://www.lintcode.com/problem/394/
方法一:递归
#include "iostream"
using namespace std;
bool s(int n);
bool f(int n){//如果剩下1或者2个硬币,先手赢。if(n == 1 || n == 2){return true;}//先手可能拿一个或两个,如果后手拿完返回有一个是true,那么先手赢。return s(n - 1) || s(n - 2);
}
bool s(int n){//如果剩下1或者2个硬币,先手赢。if(n == 1 || n == 2){return false;}//后手可能拿一个或两个,如果先手拿完返回有一个是false,那么后手赢return f(n - 1) && f(n - 2);
}
int main(){int n;cin >> n;cout << f(n) << endl;
}
方法二:dp,时间复杂度(O(n))
class Solution {public:/*** @param n: An integer* @return: A boolean which equals to true if the first player will win*/bool firstWillWin(int n) {// write your code hereif(n == 0){return false;}int f[n + 1];int s[n + 1];f[1] = true;f[2] = true;s[1] = false;s[2] = false;for(int i = 3; i <= n; i++){f[i] = s[i - 1] || s[i - 2];s[i] = f[i - 1] && f[i - 2];}return f[n];}
};
方法三:发现规律,时间复杂度(O(1))
class Solution {public:/*** @param n: An integer* @return: A boolean which equals to true if the first player will win*/bool firstWillWin(int n) {// write your code herereturn !(n % 3 == 0);}
};
硬币排成线-LintCode相关推荐
- 面试题之硬币排成线java极简解法
问题描述:有 n 个硬币排成一条线.两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止.拿到最后一枚硬币的人获胜. 请判定 第一个玩家 是输还是赢? 该题为一道典型的动态规划题,但此处 ...
- java 行为参数化_Java中的行为参数化
java 行为参数化 The past isn't here anymore, the future cannot be seen and the only thing permanent is th ...
- leetcode lintcode python
目录 1.Two Sum(Hash Table) Given an array of integers,return indices of the two numbers such that they ...
- oracle数据库批量操作系统,Oracle批量操作数据库
[转]ASP.NET MVC学习笔记-Controller的ActionResult 1. 返回ViewResult public ActionResult Index() { Vie ...
- 九章算法高频算法题 题解
专栏 | 九章算法 网址 | http://www.jiuzhang.com Google 面试题: Google 面试题 | 目标和 Google 面试题 | 建邮局 Google 面试题 | 0与 ...
- 天池在线编程 2020年9月26日 日常周赛题解
文章目录 1. K步编辑 2. 折纸 3. 字符串的不同排列 4. 硬币排成线 题目地址,请点这 1. K步编辑 给出一个只含有小写字母的字符串的集合以及一个目标串(target),输出所有可以经过不 ...
- LintCode 题解 |Google 面试题:Take Coins
题目描述 有n个硬币排成一排,每次要你从最左边或者最右侧拿出一个硬币.总共拿k次.写一个算法,使能拿到的硬币的和最大. 思路点拨 将list的前缀和求出来,然后依次枚举右边取x个,那么剩下就是左边去k ...
- Educoder实验五硬币抽选问题
任务说明 本关任务:编写动态规划法算法,求解硬币抽选问题. 相关知识 为了完成本关任务,你需要了解实验目的和实验内容. 实验目的 (1)熟悉动态规划法的基本设计思想. (2)掌握动态方程的推导过程. ...
- CleanCodeHandbook Chapter 8: Dynamic Programming(42-47)
Dynamic Programming 文章目录 Dynamic Programming leetcode70.Climbing Stairs leetcode62. Unique Paths lee ...
最新文章
- pytorch常用代码
- Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效
- DataGrid分页使用小结
- bootstrap下拉列表与输入框组结合的样式调整
- Win2003下Exchange2003部署图解之二
- svn 合并分支代码到主干
- Golang 编程思维和工程实战
- 【译】Googler如何解决编程问题
- 索引-bootsrap
- ConfirmCancelUtilDialog【确认取消对话框封装类】
- 用Alamofire进行网络请求的一段代码解析(一)
- 18.mysql优化(三)–explain分析sql语句执行效率
- Effective C++ -----条款05:了解C++默默编写并调用哪些函数
- 华为MAGICBOOK安装win10专业版,华为MAGICBOOK win10专业版X64下载
- 基于Python的文字生成图片系统
- 安装黑苹果双系统小记(昂达B365+EFI)
- js通过开始时间和结束时间计算出中间的所有日期
- 学生学籍管理系统_管理员登陆对学生的信息进行操作
- GetDC和BeginPaint
- 使用Docker pull一些软件时,遇到某个id一直处于waiting的状态