最近做到的一些有意思的数学题目(博弈,双人玩游戏)
最近做一些数学题目,感觉挺有意思的整理了一下。
1.北京理工大学2018级3月月赛A题:Ervin and Joker
https://vjudge.net/problem/Gym-241030A#author=0
简单博弈:不难看出,只要Ervin能把中间的一个或者两个拿走使之隔开,那么Ervin必胜。
所以有以下两种情况Ervin可能会输:
#include <bits/stdc++.h>using namespace std;
#define eps 1e-8
#define close ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
typedef long long ll;
const int maxn = 1e6;
const int INF = 1e9;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
ll mod = 1e9+7;
int main()
{int n , k;cin>>n>>k;if(n==0)cout<<"Joker"<<endl;else if(k==1&&n%2==0)cout<<"Joker"<<endl;else cout<<"Ervin"<<endl;
}
2.Codeforces Round #573 (Div. 2)D题:Tokitsukaze, CSL and Stone Game
http://codeforces.com/contest/1191/problem/D
AC代码:
#include <bits/stdc++.h>using namespace std;
typedef long long ll;
ll n,a[100086];int main()
{cin>>n;ll sum=0;set<ll >s;for(int i=0;i<n;i++){cin>>a[i];sum+=a[i];s.insert(a[i]);}if(s.size()<=n-2){cout<<"cslnb"<<endl;exit(0);}sort(a,a+n);int kkk=0;if(n>=3)for(int i=1;i<n-1;i++){if(a[i]==a[i+1]&&a[i-1]==a[i]-1){kkk=1;break;}}ll ans=sum-((1ll*n*(n-1))/2);if(kkk==1)cout<<"cslnb"<<endl;else if(sum==0||(a[0]==0&&a[1]==0))cout<<"cslnb"<<endl;else if(ans%2==0)cout<<"cslnb"<<endl;else cout<<"sjfnb"<<endl;
}
3.Codeforces Round #573 (Div. 2)E题:Tokitsukaze and Duel
http://codeforces.com/contest/1191/problem/E
题意:
给你一个长度为n的01字符串,和一个整数k。二人进行做博弈游戏,每个人必须选择一个连续的k个字符,把这连续的k个字符全变为0或者1。如果某次操作之后整个字符串全为1或者0,那么这个胜利,如果有无限多步要走,那么算平局,假设二人都绝顶聪明。给你初始局面,问游戏结果是什么?
思路:
首先应该明确,如果先手要赢,他一定要在第一步就赢,否则就不能再赢了。后手要赢的话,他要在他走的第一步赢,不然也不能再赢了、因为另外一个人可以重复选择他刚刚选择的区间,使其不停的翻转,可以知道这样是一直循环下去而且无意义的。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{ll n,k,i=1,x=1,y=1,z;cin>>n>>k;string str;cin>>str;while(i<n && str[i]==str[0])i++,x++;i=n-2,z=n-k-1;while(i>=0 && str[i]==str[n-1])i--,y++;if((x+k)>=n || (y+k)>=n || (str[0]==str[n-1] && (x+y+k)>=n))cout<<"tokitsukaze"<<endl;else if(str[0]!=str[n-1] && x>=z && y>=z && k>=z)cout<<"quailty"<<endl;elsecout<<"once again"<<endl;return 0;
}
4.Educational Codeforces Round 68 (Rated for Div. 2)D. 1-2-K Game
http://codeforces.com/contest/1194/problem/D
题意:
当前在n位置,每一次可以向左走1,2,或者k步,最左的位置是0,不能走到0的左边, 二人博弈问题,谁没法再走的时候就输掉,问先手必赢还是后手必赢。
思路:
首先确定的是 0位置是必输位置,因为 1 2 和k这三个位置可以一步就走到0位置,所以这3个位置是必赢位置,以此规律,我们可以递推出sg函数。
由此我们可以打个表
#include <bits/stdc++.h>using namespace std;
#define eps 1e-8
#define close ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
typedef long long ll;
const int maxn = 1e6;
const int INF = 1e9;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
ll mod = 1e9+7;
int sg[maxn];
int main()
{int n,k;n=100;cin>>k;sg[0]=0;sg[1]=1;sg[2]=1;for (int i = 3; i <= n; ++i){if((i-k)>=0){if(sg[i-1]==0||sg[i-2]==0||sg[i-k]==0){sg[i]=1;}}else{if(sg[i-2]==0||sg[i-1]==0){sg[i]=1;}}}for(int i = 0;i <= n; i++){cout<<i<<" "<<sg[i]<<endl;}return 0;
}
不 难 发现:
- 如果k是3的倍数,那么sg函数是k+1长度的循环节,对循环节取模后,判断n是否是k,如果是k,那么k位置必赢,否则判断是否是3的倍数。如果k不是3的倍数,那么判断n是否是3的倍数即可。
AC代码:
#include <bits/stdc++.h>using namespace std;
#define eps 1e-8
#define close ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
typedef long long ll;
const int maxn = 1e6;
const int INF = 1e9;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
ll mod = 1e9+7;
void solve(int n,int k){if(n==0){cout<<"Bob"<<endl;return ;}if(k%3!=0){if(n%3==0)cout<<"Bob"<<endl;else cout<<"Alice"<<endl;return ;}else {int ttt=n%(k+1);if(ttt==k||ttt%3!=0)cout<<"Alice"<<endl;else cout<<"Bob"<<endl;return ;}
}
int main()
{close;int T;cin>>T;while(T--){int n,k;cin>>n>>k;solve(n,k);}
}
通过打表找一下规律,可以大大节省时间
5.POJ1082Calendar Game
传送门:http://poj.org/problem?id=1082
题意:
给你一个年月日,你可以移动月和日,如果下个月没有当前的天数的时候你就不能移动月,当你刚好移动到11月4日你就赢了,如果你超过了十一月四日你就输了。
刚开始看这道题感觉可以用dfs,后来开始写代码时候感觉要判好几个条件,就没写下去,于是思考了一下,发现:
最终我们应该到达的是奇数点,即每次我们都需要保证自己走完后另一位所面对的是奇数局势,然后他只能走到偶数点,也就是一开始我们保证自己是偶数点开局就能赢。于是我就交了几发听取WA声。后来,参考了网上的题解。。
才知道,存在(9,30)这个点,下一个点还是奇数点(10,1),或者你可以直接走到(10,30),这样就是偶数点(聪明人都会选择前一种做法,让下一个人面对的局势是必败局),同样对于(11,30),你可以直接走到(12,1),这两个点也是必胜的。总结一下:只开局为偶数开局或者为(9,30),(11,30) 两个特殊的日子,就是必胜局,其他的为必败局。
AC代码:
#include <bits/stdc++.h>using namespace std;
#define eps 1e-8
#define close ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
typedef long long ll;
const int maxn = 1e6;
const int INF = 1e9;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
ll mod = 1e9+7;
int main()
{close;int y,m,d;int T;cin>>T;while(T--){cin>>y>>m>>d;if((m+d)%2==0||(d==30&&(m==9||m==11)))puts("YES");elseputs("NO");}return 0;
}
博弈中诸如巴什博弈,威佐夫博奕,Fibonacci博弈,尼姆博弈,公平组合博弈(Impartial Combinatori Games),我觉得都挺有意思的,等过段时间我还想研究研究…
最近做到的一些有意思的数学题目(博弈,双人玩游戏)相关推荐
- 考试题目“笨笨玩游戏”
[题目描述] 一天,笨笨和妈妈玩游戏,妈妈 给笨笨出N个正整数,让笨笨把这N个正整数连接生成一个"大"的整数,每个正整数只使用一次,让笨笨告诉妈妈这样生成的大整数的最大值. 例如, ...
- 搜集到30道有意思的数学题目
[1]假设有一个池塘,里面有无穷多的水.现有2个空水壶,容积分别为5升和6升.问题是如何只用这2个水壶从池塘里取得3升的水. [2]周雯的妈妈是豫林水泥厂的化验员. 一天,周雯来到化验室做作业.做完后 ...
- 软件工程作业之小学数学题目
软件描述:该软件实现小学数学题目生成以及对运算结果进行判断,最后统计出正确题目以及错误的题目,便于学生及时改正自己的错误,另外,该软件存在比较明显的缺陷,不能进行四则混合运算.希望在以后的学习实践中可 ...
- 高考数学题目:导数及其简单应用
高考数学题目:导数及其简单应用(有电子完整版)私信领取. 今天高考数学题目:导数及其简单应用分享就到这里了,关注高中数学肖博老师为大家分享更多高中数学知识点和视频教程.
- 有意思的数学--数系的发展历史
有意思的数学--数系的发展 在数学中,数系指的是数的不同集合,比如自然数N,整数,在数学的学习过程中,对公式和概念的记忆往往是痛苦的,但是如果我们能理解它们,弄清它们的来龙去脉,对记忆的帮助是相当大的 ...
- 趣味数学:解24点游戏小技巧
漫漫暑假怎么度过呢?大笨兔给大家介绍一种趣味游戏吧.就是之前大笨兔在博客中提到的24点游戏 二十四点是一种益智游戏,它能在游戏中锻炼人们的心算,它往往要求人们将四个数字进行加减乘除四则混合运算(允许使 ...
- 游戏中的数学与物理学 第二版_在数学课堂中适度开展游戏活动,可以提高课堂教学效率...
[摘要]小学生是以无意注意为主的,而无意注意又受兴趣的影响,更何况数学是一门比较抽象的学科.因此,在数学课中适度引入游戏是很有必要的.基于学生的心理特征,学生需要游戏,恰当的游戏不仅能够调节课堂气氛, ...
- 写给英语和数学都不怎么好的游戏开发爱好者
[来信] 贺老师你好,我想学习C ,以后成为一名游戏开发员,可是我的英文和数学都不怎么好.我不知道该怎么办,从哪里学起,但是我确信这是我可以为之奋斗一生的事业. [回信] 你的来信,没有给我讲起你的专 ...
- [GDUT]1060: 跟XxX_Stu 玩游戏(很简单题目)
1060: 跟XxX_Stu 玩游戏 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 17 Solved: 15 Description XxX_Stu ...
最新文章
- opengles2.0 帧缓存对象(FBO)
- U盘安装MacOS Sierra系统方法
- 第二章 数组名是一个指针常量吗?
- ABAP Development Tools的语法增强
- ASP.NET 2.0 中的新增服务、控件与功能概述(四)
- 学好Java的10个建议
- 备份Mysql数据库时,报 Couldn't execute 'show fields from的一种问题解决方案
- linux 指针什么意思,在linux中获取指向结构设备指针的更简洁方法是什么?
- MNIST数据集手写数字识别(二)
- PC服务器实现海量数据存取的方法
- IOS --xcode删除Provisioning Profiles文件
- 360浏览器清除缓存_手机中的缓存是什么?
- 举例在项目中动态构建自己的程序集,.NET产生动态程序集!
- 什么是无线射频识别技术(RFID)
- 新中大财务软件-A3中怎样更改IP地址
- 俄语入门-俄语语音规则
- Moviepy自动化视频处理:添加音频、背景音乐,实现多轨音频
- vbs实现软件自动登录(以谷歌浏览器打开网站并登陆为例)
- Xshell连接路由器或交换机Console口
- Java 岗面经:两年半经验,面 10 个公司,经 28 轮面试,拿 9 个 offer,涨麻了。
热门文章
- 【龙芯1B】:有源蜂鸣器例程
- 2020春节假期VR/AR资讯汇总
- 详细图解如何注册 Navicat for Mysql 11.0.17 企业版(Win7 64bit)
- 聚合收款码有限制吗?怎么办理?
- java.lang.SecurityException: User has not given permission to device UsbDevice
- position:sticky 粘性定位 (sticky) 与 固定定位
- java 对大数据的处理
- win10耳机有杂音滋滋_蓝牙耳机的底噪和电流声有区别吗?双11五款高续航平价蓝牙耳机分享...
- Dfinity(ICP)基础开发教程-5
- Docker学习(五):Docker网络