﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-HooLee-随笔分类-博弈</title><link>http://www.cppblog.com/hoolee/category/20511.html</link><description>If you believe, you can!</description><language>zh-cn</language><lastBuildDate>Sat, 04 May 2013 08:35:12 GMT</lastBuildDate><pubDate>Sat, 04 May 2013 08:35:12 GMT</pubDate><ttl>60</ttl><item><title>poj2348简单博弈</title><link>http://www.cppblog.com/hoolee/archive/2013/05/04/199963.html</link><dc:creator>小鼠标</dc:creator><author>小鼠标</author><pubDate>Sat, 04 May 2013 08:21:00 GMT</pubDate><guid>http://www.cppblog.com/hoolee/archive/2013/05/04/199963.html</guid><wfw:comment>http://www.cppblog.com/hoolee/comments/199963.html</wfw:comment><comments>http://www.cppblog.com/hoolee/archive/2013/05/04/199963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/hoolee/comments/commentRss/199963.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/hoolee/services/trackbacks/199963.html</trackback:ping><description><![CDATA[<p><span style="font-family:宋体;">题意：</span></p>  <p><span style="font-family:宋体;">给定两个非负数，可以用<strong>较小那个数</strong>的任意正整数倍数去减<strong>较大那个数</strong>，但要保证结果非负。两个人轮流操作，结果中先出现</span>0<span style="font-family:宋体;">的那个人获胜。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">第一次做博弈题，不知如何下手。这里认真分析一下。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">假设两个数</span>a b<span style="font-family:宋体;">，他们的大小关系无非是</span><strong>a&gt;b,a&lt;b,a==b</strong><strong><span style="font-family:宋体;">中的一种</span></strong><span style="font-family:宋体;">，对本题二样前两种其实是同一种情况，第三种情况时结果已经出来了（此时轮到谁谁获胜）。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">我们再来讨论</span>a&gt;b<span style="font-family:宋体;">（</span>a&lt;b<span style="font-family:宋体;">）的情况，又可细分为：</span></p>  <p><strong>b&lt;a&lt;2 * b (1)</strong></p>  <p><strong>a == 2 * b (2)</strong></p>  <p><strong>a &gt;2*b (3)</strong></p>  <p><strong><span style="font-family:宋体;">对情况（</span>1</strong><strong><span style="font-family:宋体;">）</span></strong><span style="font-family:宋体;">，选手没得选，只能用较小的树去减较大的数，下一个状态一定是</span>b<span style="font-family:宋体;">，</span>a%b<span style="font-family:宋体;">。也就是说这种状态的出现不会影响最终结果。</span></p>  <p><strong><span style="font-family:宋体;">情况（</span>2</strong><strong><span style="font-family:宋体;">）</span></strong><span style="font-family:宋体;">，显然，也可以结束游戏了，当前选手赢了。</span></p>  <p><strong><span style="font-family:宋体;">情况（</span>3</strong><strong><span style="font-family:宋体;">）</span></strong><span style="font-family:宋体;">，此时选手可以决定下一个状态是下面状态中的一种：</span></p>  <p>a-b, b</p>  <p>a-2*b, b</p>  <p>a-3*b, b</p>  <p><strong>.</strong></p>  <p><strong>.</strong></p>  <p><strong>.</strong></p>  <p>a%b+b, b <span style="font-family: 宋体;">（</span>k-1<span style="font-family:宋体;">）</span></p>  <p>b, a%b <span style="font-family: 宋体;">（</span>k<span style="font-family:宋体;">）</span></p>  <p><span style="font-family:宋体;">由于两个选手必须轮流操作，因此，<strong><span style="color:red">两相邻的状态的输赢结果一定相反</span></strong>。而此时，选手恰恰可以决定是到状态（</span>k-1<span style="font-family:宋体;">）还是到状态（</span>k<span style="font-family:宋体;">）<strong><span style="color:red">（状态（</span></strong></span><strong><span style="color:red">k-1</span></strong><strong><span style="font-family:宋体; color:red">）的下一个状态一定是状态（</span><span style="color:red">k</span></strong><strong><span style="font-family:宋体; color:red">），因为情况（</span><span style="color:red">1</span></strong><strong><span style="font-family:宋体; color:red">））</span></strong><span style="font-family:宋体;">，也就是<strong>说此时选手能决定自己的输赢</strong>。</span></p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">综上我们可以得到如下结论</span></p>  <p><span style="font-family:宋体;">出现下述情况之一的就可断定当前选手获胜：</span></p>  <p>1.a==b</p>  <p>2.a&gt;=2*b</p>  <p>&nbsp;</p>  <p><span style="font-family:宋体;">细节：如果一开始输入数据为</span>a<span style="font-family:宋体;">，</span>0<span style="font-family:宋体;">，本题认为</span>Ollie wins<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;java.io.*;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.*;<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;Main&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;firstWin;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a,&nbsp;b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scanner&nbsp;sc&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Scanner(System.in);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;sc.nextInt();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;sc.nextInt();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(a&nbsp;!=&nbsp;0&nbsp;||&nbsp;b&nbsp;!=&nbsp;0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstWin&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">初始认为Stan&nbsp;wins</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(a&nbsp;&gt;=&nbsp;b)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get(a,&nbsp;b);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get(b,&nbsp;a);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(firstWin)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Stan&nbsp;wins");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Ollie&nbsp;wins");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;sc.nextInt();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;sc.nextInt();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;get(<span style="color: #0000FF; ">int</span>&nbsp;a,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;b){<span style="color: #008000; ">//</span><span style="color: #008000; ">a&nbsp;&gt;=&nbsp;b</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(a&nbsp;==&nbsp;b)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(b&nbsp;==&nbsp;0){<span style="color: #008000; ">//</span><span style="color: #008000; ">边界情况，如果一开始输入是b为零，我们认为Ollie&nbsp;wins</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstWin&nbsp;=&nbsp;&nbsp;!firstWin;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(a&nbsp;/&nbsp;b&nbsp;&gt;=&nbsp;2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstWin&nbsp;=&nbsp;&nbsp;!firstWin;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get(b,&nbsp;a&nbsp;%&nbsp;b);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><p>&nbsp;</p><img src ="http://www.cppblog.com/hoolee/aggbug/199963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/hoolee/" target="_blank">小鼠标</a> 2013-05-04 16:21 <a href="http://www.cppblog.com/hoolee/archive/2013/05/04/199963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>