程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 2897 邂逅明下

HDU 2897 邂逅明下

編輯:C++入門知識


題意:一堆石子n個,A,B兩人輪流從中取,每次取的石子必須在區間[p,q]內,若剩下的石子少於p個,

取石者須全部取完。最後取石子的者輸。給出n,p,q,問先取者是否有必勝策略?

思路:巴什博弈變形

證明:假設先手為A,後手為B,初始n個,除最後一次每次取的石子個數必須

在區間[p,q]內,則:

1.若當前石子共有n = (p+q)*k個,則A必勝,必勝策略為:

    A第一次取q個,以後每次若B取m個,A取(p+q-m)個,如此最後必剩下p個給B,A勝

2.若n = (p+q)*k+r,(1<r<=p),則B必勝,必勝策略為:

   每次取石子活動中,若A取m個,則B取(p+q-m)個,那麼最後必剩下r個給A,

   此時r<=p,A只能一次取完,B勝

3.若n = (p+q)*k+r,(p<r<p+q),則A必勝,必勝策略為:

   A第一次取t(1<r-t<=p)個,以後每次若B取m個,A取(p+q-m)個,

   那麼最後必剩下1<r-t<=p個給B,A勝

[cpp] 
<span style="font-size:18px;color:#006600;"><strong>#include<stdio.h> 
int main() 

   int n,p,q,r; 
   while(scanf("%d%d%d",&n,&p,&q)!=EOF) 
   { 
      r=n%(p+q); 
      if(r<=p&&r>0) 
       printf("LOST\n"); 
       else printf("WIN\n"); 
   } 
   return 0; 
}</strong></span> 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved