日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU - 4388 Stone Game II(博弈+思维)

發布時間:2024/4/11 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU - 4388 Stone Game II(博弈+思维) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:最初有n堆石子,每堆石子的數目已知,現在有兩個人輪流按照下列規則操作,不能操作的一方即為失敗

  • 首先選擇一堆石子,設該堆石子目前有x個,從中拿走a個石子,剩下了k個石子,a和k必須滿足
  • 0<a<x
  • 0<k<x
  • k^x<x
  • 然后加入一堆新的石子,數目為k^x,每個人每一局可以使用一次技能,讓新增加的石子為(2*k)^x
  • 題目分析:這個題如果直接去分析挺難想的,我們可以轉換一下思維模式,上述兩個規則無疑就是將n堆石子中滿足條件的一堆分成了兩堆,其新的值為k和k^x,直到不能再分為止,能想到這里還是差點火候,下面我用網上大佬的思路,來證明一下k和k^x的關系:

    我們分成四種情況,討論其中二進制的某一位p:

    xkk^x
    000
    011
    101
    110

    通過上表,我們可以看出,在將x分為k和k^x后,1的個數之和的奇偶性不變,然后從某一位p的結論推廣到整個x和k中,可以得到相同的結論,我也不知道是怎么想到的。。換做是我肯定想不到orz

    下面在討論一下關于終止條件,也就是必敗條件是什么,我們選出其中一堆,若該堆石子的數目轉換為二進制后,1的數目只有一個,那么該堆是無法再分的,因為題目要求了k^x<x,所以我們找不出合適的k來滿足條件(反之,若1的數目大于一個的話,我們每次都可以從x中選取任意數目的1,并且給x中剩下一定數目的1,即可滿足條件)

    所以我們現在有了兩個結論:

  • x 和k與k^x中1的數目之和的奇偶性相同
  • 每次k至少需要選擇x中任意數目的1
  • 最后再分析一下每個人可以使用的那個技能,因為是將k^x變為(2k^x),乘二在二進制里也不會影響1的數目之和的奇偶性,所以這個技能實際上沒有什么貢獻

    綜上所述,我們只需要分析一下初始時n堆石子中1的數目之和,然后減去原本n堆中需要保留的一個1(必敗態),再判斷一下奇偶性就能判斷操作次數了,如果答案為奇數,則先手能操作最后一步,先手必勝,否則先手必敗

    對了,因為這個題目需要統計每個數字中1出現的次數,一般來說我們都會直接跑一遍二進制,今天學會了一個更快的方法可以優化,就是用n&(n-1),下面放上大佬的證明:

    https://blog.csdn.net/u013243347/article/details/52220551

    實現代碼:

    #include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=2e5+100;int getnum(int n) {int cnt=0;while(n){n&=n-1;cnt++;}return cnt; }int main() { // freopen("input.txt","r",stdin);int w;cin>>w;int kase=0;while(w--){int n;int ans=0;scanf("%d",&n);for(int i=1;i<=n;i++){int num;scanf("%d",&num);ans+=getnum(num);}printf("Case %d: %s\n",++kase,(ans-n)&1?"Yes":"No");}return 0; }

    ?

    總結

    以上是生活随笔為你收集整理的HDU - 4388 Stone Game II(博弈+思维)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。