最近做一些数学题目,感觉挺有意思的整理了一下。

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


写的时候被hack了,后来面向测试点的编程过了……

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),我觉得都挺有意思的,等过段时间我还想研究研究…

最近做到的一些有意思的数学题目(博弈,双人玩游戏)相关推荐

  1. 考试题目“笨笨玩游戏”

    [题目描述] 一天,笨笨和妈妈玩游戏,妈妈 给笨笨出N个正整数,让笨笨把这N个正整数连接生成一个"大"的整数,每个正整数只使用一次,让笨笨告诉妈妈这样生成的大整数的最大值. 例如, ...

  2. 搜集到30道有意思的数学题目

    [1]假设有一个池塘,里面有无穷多的水.现有2个空水壶,容积分别为5升和6升.问题是如何只用这2个水壶从池塘里取得3升的水. [2]周雯的妈妈是豫林水泥厂的化验员. 一天,周雯来到化验室做作业.做完后 ...

  3. 软件工程作业之小学数学题目

    软件描述:该软件实现小学数学题目生成以及对运算结果进行判断,最后统计出正确题目以及错误的题目,便于学生及时改正自己的错误,另外,该软件存在比较明显的缺陷,不能进行四则混合运算.希望在以后的学习实践中可 ...

  4. 高考数学题目:导数及其简单应用

    高考数学题目:导数及其简单应用(有电子完整版)私信领取. 今天高考数学题目:导数及其简单应用分享就到这里了,关注高中数学肖博老师为大家分享更多高中数学知识点和视频教程.

  5. 有意思的数学--数系的发展历史

    有意思的数学--数系的发展 在数学中,数系指的是数的不同集合,比如自然数N,整数,在数学的学习过程中,对公式和概念的记忆往往是痛苦的,但是如果我们能理解它们,弄清它们的来龙去脉,对记忆的帮助是相当大的 ...

  6. 趣味数学:解24点游戏小技巧

    漫漫暑假怎么度过呢?大笨兔给大家介绍一种趣味游戏吧.就是之前大笨兔在博客中提到的24点游戏 二十四点是一种益智游戏,它能在游戏中锻炼人们的心算,它往往要求人们将四个数字进行加减乘除四则混合运算(允许使 ...

  7. 游戏中的数学与物理学 第二版_在数学课堂中适度开展游戏活动,可以提高课堂教学效率...

    [摘要]小学生是以无意注意为主的,而无意注意又受兴趣的影响,更何况数学是一门比较抽象的学科.因此,在数学课中适度引入游戏是很有必要的.基于学生的心理特征,学生需要游戏,恰当的游戏不仅能够调节课堂气氛, ...

  8. 写给英语和数学都不怎么好的游戏开发爱好者

    [来信] 贺老师你好,我想学习C ,以后成为一名游戏开发员,可是我的英文和数学都不怎么好.我不知道该怎么办,从哪里学起,但是我确信这是我可以为之奋斗一生的事业. [回信] 你的来信,没有给我讲起你的专 ...

  9. [GDUT]1060: 跟XxX_Stu 玩游戏(很简单题目)

    1060: 跟XxX_Stu 玩游戏 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 17 Solved: 15 Description XxX_Stu ...

最新文章

  1. opengles2.0 帧缓存对象(FBO)
  2. U盘安装MacOS Sierra系统方法
  3. 第二章 数组名是一个指针常量吗?
  4. ABAP Development Tools的语法增强
  5. ASP.NET 2.0 中的新增服务、控件与功能概述(四)
  6. 学好Java的10个建议
  7. 备份Mysql数据库时,报 Couldn't execute 'show fields from的一种问题解决方案
  8. linux 指针什么意思,在linux中获取指向结构设备指针的更简洁方法是什么?
  9. MNIST数据集手写数字识别(二)
  10. PC服务器实现海量数据存取的方法
  11. IOS --xcode删除Provisioning Profiles文件
  12. 360浏览器清除缓存_手机中的缓存是什么?
  13. 举例在项目中动态构建自己的程序集,.NET产生动态程序集!
  14. 什么是无线射频识别技术(RFID)
  15. 新中大财务软件-A3中怎样更改IP地址
  16. 俄语入门-俄语语音规则
  17. Moviepy自动化视频处理:添加音频、背景音乐,实现多轨音频
  18. vbs实现软件自动登录(以谷歌浏览器打开网站并登陆为例)
  19. Xshell连接路由器或交换机Console口
  20. Java 岗面经:两年半经验,面 10 个公司,经 28 轮面试,拿 9 个 offer,涨麻了。

热门文章

  1. 【龙芯1B】:有源蜂鸣器例程
  2. 2020春节假期VR/AR资讯汇总
  3. 详细图解如何注册 Navicat for Mysql 11.0.17 企业版(Win7 64bit)
  4. 聚合收款码有限制吗?怎么办理?
  5. java.lang.SecurityException: User has not given permission to device UsbDevice
  6. position:sticky 粘性定位 (sticky) 与 固定定位
  7. java 对大数据的处理
  8. win10耳机有杂音滋滋_蓝牙耳机的底噪和电流声有区别吗?双11五款高续航平价蓝牙耳机分享...
  9. Dfinity(ICP)基础开发教程-5
  10. Docker学习(五):Docker网络