翻硬币问题——数学建模
- 格式:pdf
- 大小:691.31 KB
- 文档页数:6
作者: 杨金珏翻硬币问题诀窍翻硬币问题诀窍硬币问题是公务员考试出现的数学运算题型,属于逻辑类考题,这类问题变化复杂,对考生的推理能力要求高。
博大弘仕杨金珏老师将在这里介绍翻硬币问题的快速解题技巧。
首先要明白什么是“翻硬币问题”,通常题面形式是这样的:M个硬币全部正面朝上,现在要求每次必须同时翻转其中的N个硬币,至少翻转多少次才能使全部硬币反面朝上?那么可能出现四种情况:硬币总数(M)每次翻硬币数量(N)奇奇奇偶偶奇偶偶上面四种情况中,只有当硬币总数是奇数个并且每次翻偶数个硬币时,不能完成要求,其他三种都可以完成翻转。
为什么不能完成这种情况呢?根据奇偶的基本性质可以推导出来,每个硬币必须翻转奇数次才能实现反面朝上,现在总数是奇数,那么所有硬币翻转总数就是奇数个奇数,其结果必定是个奇数。
但是每次翻转偶数个硬币,那么硬币被翻动的总数为偶数乘以翻动次数,结果必定是偶数。
所以这种情况下是不可能完成任务的。
翻硬币问题形式多样,这里总结出了一个基本的解题步骤。
第一步:判断总个数是否与每次翻的个数呈倍数关系。
如果是倍数关系,翻动次数=M÷N第二步:如果没有倍数关系,考虑硬币总数的奇偶情况。
当总数为偶数(1)每次翻的个数是总数减一【例1】现有6个一元面值硬币正面朝上放在桌子上,你可以每次翻转5个硬币(必须要翻转5个),问你最少要经过几次翻转可以使这6个硬币全部反面朝上?A.5次B.6次C.7次D.8次【解析】本题属于归纳推理问题。
一个硬币要翻面,需要翻奇数次,一共有6个硬币,每一次翻转5个,那么必须翻转偶数次才能保证每一枚硬币翻转奇数次,故排除A、C。
因为每次翻五个,则有一个没被改变,或者说每次是在原来的基础上变一个,一共有6个硬币,每次变一个,那么需要6次才能全部变完。
具体过程如下:故需要6次,故正确答案为B。
这类问题的解答公式为:翻动次数=M翻动方法:只要按照第一次第一个不翻,第二次第二个不翻,按照此方法进行操作就可以成功。
于硬币翻转问题——作者:⊿风之〆恶魔(逆流)整理:比基尼哥哥首先,我们要知道翻硬币的四种情况:一、奇数个硬币,每次翻奇数次二、奇数个硬币,每次翻偶数次三、偶数个硬币,每次翻奇数次四、偶数个硬币,每次翻偶数次(注:只有奇数个硬币翻偶数次不能完成翻转,其他三种都可以完成翻转。
)其次,我们要先理解硬币翻转是怎么回事,这类考题都是有以下特点的:1、M个硬币同处于某一面比如说是正面朝上,然后我们设定一次必须同时翻转N个硬币这样一个条件,那我们到底要至少翻转多少次才能达到这个目的呢?2、我们知N一般都是设定是奇数的,M是偶数的,为什么?当然这并不是说N不能是偶数,因为如果N:M=A:B能够转化的话,使达到A,B都是整数的同时,B也是奇数的话也是可以的。
我们为什么要强调N是奇数类型,或者M:N可以化简到奇数的形式呢?因为M肯定是大于N的吧,M-N可以为奇数也可以为偶数。
如果是偶数的话,那好可以分解成1,1的形式(2,2等)也是可以的。
然后我们借助前面全部翻转的N个硬币其中的N-1个,就能让他们同时和1,1这两个硬币一起翻转,最终就能达到全部翻转成功的目的;如果是奇数的话,那我们可以不用减,直接把M分解出来。
至少可以分解成1,1,1,……,1一共是M个1的形式,然后同样的利用借助共同的硬币一起翻转的目的。
因为一个硬币被利用翻转两次的话就回到原来的状态。
这也是M-N正好等于1的类型,为什么是翻转M次的解释。
当然还有种特殊的,比如说86,每次翻转4个,要经过多少次才能达到目的?80/4=20还有6=3+3正好利用好,所以是22次。
也就是说偶数对偶数其实也是可以翻的。
为什么这么说呢?因为偶数可以转化成M个1,而且M是偶数,所以他们利用起来的其它数字能正好对称满足。
综上我们知道只有一种情况,那就是N是奇数,M是偶数的话翻不了,其它情况都可以。
当然方法在我们研究的过程中也已经分析解释清楚了。
M-N=1的话那就是M次其它的基本就是M/N的整数商+1或者+2或者+3的情况。
翻硬币问题翻硬币问题有好几种。
其中的一种是这样的:桌子上有q = m + n枚硬币,m正面朝上,n枚反面朝上,每一轮翻p枚,在每一轮翻币的时候,被翻的同一枚硬币只能翻一次。
问最少多少次能把所有的硬币翻成全部正面或者反面朝上?根据问题的描述,问题实际上隐含:m 、n、 p > 0,m + n > p。
这个问题往往是计算机编程的问题。
涉及广度优先还是深度优先搜索。
我对广度优先还是深度优先搜索了解的甚少。
以下是用笨办法求解的。
1)币面状态数:用 (正面朝上币数, 反面朝上币数 )表示,显然初始状态是( m, n )。
假设第一轮翻币翻反面(或者正面)的硬币数为:i1<=n,则第一轮翻币分别翻正面(或者反面)的硬币数为:p - i1 <m, 此时币面状态数为:( m – ( p - i1 ) + i1, n - i1 + ( p - i1 ) ) = ( m – p + 2 * i1 , n + p - 2 * i1) 第二轮翻币翻反面(或者正面)的硬币数为:i2< n + p - 2 * i1,则第二轮翻币分别翻正面(或者反面)的硬币数为:p – i2 < m – p + 2 * i1, 此时币面状态数为:( m – p + 2 * i1 – ( p – i2 ) + i2, n + p - 2 * i1 + p - 2 * i2)= ( m – 2 * p + 2 * ( i1 + i2 ), n + 2 * p - 2 * ( i1 + i2 ) )第三轮币面状态数:( m – 3 * p + 2 * ( i1 + i2 + i3), n + 3 * p - 2 * ( i1 + i2 + i3)) ……………………………………………………第k轮币面状态数:( m – k * p + 2 * ( i1 + i2 + … + i k), n + k * p - 2 * ( i1 + i2 + … + i k))简记:t = i1 + i2 + … + i k,则第k轮币面状态数可以标示为:( m – k * p + 2 * t, n + k * p - 2 * t)2)完成翻币条件如果在某一轮翻币后,正面币数或者反面币数能被p整除(其中之一等于零也被包含),则以后的每一轮全翻那个币面数能被p整除的那一部分就可以完成翻币,这一段话的意思就是:m – k * p + 2 * t = s * p或:n + k * p - 2 * t = s * p稍微变换一下:m – k * p + 2 * t = s * p —> ( s + k ) * p – 2 * t = m或:n + k * p - 2 * t = s * p —> ( s – k ) * p + 2 * t = n因此问题转换为求解不定方程:( s + k ) * p – 2 * t = m或者( s – k ) * p + 2 * t = n隐含条件:t >= 0, k >= 0, s >= 0, 如果t > 0, k > 0, s >= 0m – k * p + 2 * t >= 0, n + k * p – 2 * t <= m + n Æ k * p – 2 *t <= m同时还必须:m – k * p + 2 * t <= m + n Æ 2 * t – k * p <= n, n + k * p – 2 * t >= 0 3)二元一次不定方程的整数解这个问题网上有多个介绍,可以谷歌或者百度一下,答案一大堆。
对教材“翻硬币的游戏问题”的深入探究摘要:“翻硬币的游戏”问题,解决这个问题首先要确定能否进行翻转,二是如何确定翻转的最少次数。
为了使动手操作时更为直观和方便,把课本中的“翻硬币”改为翻纸杯。
关键词:数学原理,翻转次数的最大值,数字化的赋值,广泛应用;青岛版七年级上学期数学教科书第63页“知趣园”中,有一个“翻硬币的游戏”问题。
教学中发现有的学生对课本的解释不太明白,也有的学生明白了5枚硬币,各枚的正面都朝上,每次翻动其中的4枚,不论翻动多少次,都不能使硬币的正面都朝下;但对“翻动其中的3枚,经过若干次后,使5枚硬币的正面都朝下不理解;还有的学生对“经过若干次后”这个若干次的最小次数是多少产生了兴趣,但一直找不到正确的方法解决这一问题。
笔者对这个游戏进行了深入细致的研究,从而发现解决问题的方法,提供给大家参考。
解决这个问题首先要确定能否进行翻转,二是如何确定翻转的最少次数。
为了使动手操作时更为直观和方便,把课本中的“翻硬币”改为翻纸杯。
以下笔者就这一翻转纸杯游戏进行探究。
问题1:现有4个完全相同的纸杯,杯口全部向上,每次翻转其中3个,经过几次翻转,可使杯口全部向下?由于纸杯是完全相同的,仅仅是杯口向上或杯口向下的区别,可以给每个纸杯赋以数值。
每个杯口向上的纸杯记为“+1”,每个杯口向下的纸杯记为“-1”。
这样可把翻转纸杯看成一种“运算”:每次翻转1个纸杯,使杯口由向上变为向下,或使杯口由向下变为向上,相当于把原来的结果乘以“-1”。
4个杯口全部向上的纸杯是4个“+1”,4个杯口全部向下的纸杯是4个“-1”。
我们由建立一种“运算”,使开始时4个“+1”化为结束时的4个“-1”成立,则翻转成功。
由于纸杯在翻转前后的数量是完全相同的,不妨取它们的“积”作为这种运算的始末,4个“+1”的积是“+1”,4个“-1”的积是“+1”。
由这样建立的一种“运算”,使积“+1”化为积“+1”成立。
翻转纸杯的过程,用图演示如下:初始状态:+ + + +第一次:- - - +第二次:- + + -第四次:- - - -每次翻转其中3个纸杯,相当于把原来的结果乘以3个“-1”。
翻硬币问题桌面上有n枚硬币, 初态是全部正面向上,现让你每轮把其中的m (2m≤n)枚翻转,希望最终全部反面向上. 请建立数学模型研究n, m 在什么条件下此问题有解或无解.解答:1.概念与性质定义:纯翻转-------m个都是正面的一轮翻转;(混合)翻转------取a (>0)个正面,m-a个反面的一轮翻转.显然,纯翻转是混合翻转的特例(a=m).设=+,(1)n sm t≤<, s为正整数.其中,t为n除以m的余数,0t m记变量k表示当前的正面数.显然,从开始,经过s轮纯翻转后k=t; 当k=0时,就成功了.性质1. 选a个正面和m-a个反面的一轮翻转后,正面数的变化量为.k m a∆=-,(2)2∆=-.特别是,做纯翻转时,k m性质2. 当k(<2m)为偶数时,只需再翻两轮必会成功.证明:若k=m , 则做一轮纯翻转必成功.≠,则先选k/2个正面和m-k/2个反面做一轮翻转,若k m1(注:因2m<n<2n-k, 故2m<2n-k, 2m-k<2n-2k, m-k/2<n-k, n-k是反面数,即这样选取是可行的. )则翻转后的正面数k k k k m k m=+∆=+-='()k=,就成功了.再做一轮纯翻转,"0≠时,只翻一轮必定未能成功,故翻两轮必是最佳方法因为k m(轮数最少)2.情形一,m是奇数(不论n是奇数还是偶数).先做s-1轮纯翻转,得k=m+t. 只有如下3种可能:(ⅰ)t=0. k=m, 再做一轮纯翻转就成功.(ⅱ)t (<m)是奇数. k已是偶数,且m<k<2m.由性质2,只需再翻两轮必会成功.(ⅲ)t (<m)是偶数. 再做一轮纯翻转后化为k=t. 由性质2,只需再翻两轮必会成功.3.情形二,n,m都是偶数. 由(1)式知t是偶数或0, 经s轮纯翻转后,k=t,由性质2,至多再翻两轮就会成功.4.情形三,n是奇数,m是偶数. 由(1)式知t是奇数, 由(2)式知, k∆是偶数或0,故无论翻转多少轮,k始终是奇数, 不会出现k=0, 即不会成功.25.综合6. 例子例1.n=8,m=3, s=2, t=2. 翻4轮必成功0------正面,1------反面例2 . n=7,m=3, s=2, t=1. 翻3轮必成功34推广把以上的条件2m ≤n , 改为 m ≤n 。
蓝桥杯历届试题翻硬币(贪⼼)历届试题翻硬币时间限制:1.0s 内存限制:256.0MB问题描述⼩明正在玩⼀个“翻硬币”的游戏。
桌上放着排成⼀排的若⼲硬币。
我们⽤ * 表⽰正⾯,⽤ o 表⽰反⾯(是⼩写字母,不是零)。
⽐如,可能情形是:**oo***oooo如果同时翻转左边的两个硬币,则变为:oooo***oooo现在⼩明的问题是:如果已知了初始状态和要达到的⽬标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局⾯,最少要翻动多少次呢?我们约定:把翻动相邻的两个硬币叫做⼀步操作,那么要求:输⼊格式两⾏等长的字符串,分别表⽰初始状态和要达到的⽬标状态。
每⾏的长度<1000输出格式⼀个整数,表⽰最⼩操作步数。
样例输⼊1**********o****o****样例输出15样例输⼊2*o**o***o****o***o**o***样例输出21 贪⼼题。
我的思路是先对两个字符串进⾏⽐较,⽤数组记录下⽐较的结果,0表⽰字符相同,1表⽰字符不同。
⽤题⽬给的例⼦⽰范: ********** o****o**** ⽐较结果为: 1000010000 翻动次数就是两个1之间的下标之差。
当然也有些复杂的情况,若⽐较结果为: 101101100101 你是直接翻动中间的两个“11”处的硬币再解决其它硬币呢(因为翻动相邻的两个硬币只算⼀次操作),还是按上⾯的规则依次计算呢? 这道题“贪⼼”之处就在这⾥,事实上从左到右依次按上⾯蓝字的规则累加计数,就可求得最优结果。
代码如下:1 #include <iostream>2using namespace std;3int main()4 {5char s1[1000];6char s2[1000];7int cr[1000]; //记录两个字符串的⽐较结果。
0为相同,1为不同。
8while(cin>>s1){9 cin>>s2;10int l;11for(l=0;s1[l]!='\0';l++); //计算长度12for(int i=0;i<l;i++){ //⽐较两个字符串,并记录结果13if(s1[i]==s2[i])14 cr[i]=0;15else16 cr[i]=1;17 }18int f=-1; //记录标记位19int _count=0;20for(int i=0;i<l;i++){21if(cr[i]==1){ //检测到⼀个 122if(f==-1){ //如果前⾯没有记录的1的下标,记录当前1的下标23 f=i;24 }25else{ //如果前⾯有⼀个1了26 _count+=i-f;27 f=-1;28 }29 }30 }31 cout<<_count<<endl;32 }33return0;34 }Freecode :。
用数学方法模拟翻硬币问题背景:一摞硬币共m枚,每枚硬币均正面朝上,取最上面的1枚,将它翻面后放回原处,然后取最上面的2枚硬币,将它们一起翻面后再放回原处。
再取3枚,4枚,…,直至整摞硬币都按上述方法处理过。
接下来再从这摞硬币最上面的1枚开始,重复刚才的做法。
这样一直做下去,直至这摞硬币中的每一个又都是正面朝上为止。
问这种情形是否一定出现?如果出现,则一共需做多少次翻面?问题分析:很明显,当完成这样的一组翻面后,只须每枚硬币的累计翻面次数为偶数,就可以使这一摞硬币中每一枚都是正面朝上。
每当完成这样一组翻面时,翻面之前硬币的顺序被打乱,如果从一开始就将硬币从上至下依次标号为1,2,3,…,m,对硬币顺序的调整和一组翻面完成后对应标号硬币的翻面次数进行跟踪,那么就可以实现判断何时能出现这摞硬币中的每一个又都是正面朝上。
问题简化和假设:首先对这摞硬币从上至下依次标号为1,2,3,…,m,就构成一个行向量a=[1,2,3,…,m],题中翻面所引起的硬币顺序的调整可以简化为对这个列向量右乘一系列m阶初等矩阵(这里用到的初等矩阵均为交换m阶单位阵的某两行得到的),例如:当m=5时:取1枚硬币翻面,顺序未变化;取2枚硬币翻面,标号1和标号2的硬币顺序交换,则:对向量a右乘E12;取3枚硬币翻面,标号1和标号3的硬币顺序交换,则:继续右乘E13;取4枚硬币翻面,标号1和标号2的硬币顺序交换,则:继续右乘E14,E23;取5枚硬币翻面,标号1和标号2的硬币顺序交换,则:继续右乘E15,E24;故,最终得到的硬币顺序对应的行向量为:a*E12*E13*E14*E23*E15*E24建立模型:当对一摞m个硬币进行一组翻面操作后,可以用归纳法得到:从上至下,第i个硬币的翻面次数为m+1-i;例如:第1个硬币共翻面m次;第2个硬币翻面m-1次;第m个硬币翻面1次;换言之,在一组翻面中,翻面次数只与硬币的位置有关,那么就可以通过次数统计向量行向量sum与标号向量a做相同的变换,即右乘一系列初等矩阵,来实现向量sum和a的分量的一一对应,即标号为a(i)的硬币的累计翻面次数为:sum(i)=sum(i)+(m+1-i)硬币顺序的变换就用右乘一系列初等矩阵的方法,在编写计算机程序时通过循环和限定条件来实现。