1. 程式人生 > 其它 >877. 石子游戲 力扣 中等 博弈

877. 石子游戲 力扣 中等 博弈

題目描述:

亞歷克斯和李用幾堆石子在做遊戲。偶數堆石子排成一行,每堆都有正整數顆石子piles[i]。

遊戲以誰手中的石子最多來決出勝負。石子的總數是奇數,所以沒有平局。

亞歷克斯和李輪流進行,亞歷克斯先開始。 每回合,玩家從行的開始或結束處取走整堆石頭。 這種情況一直持續到沒有更多的石子堆為止,此時手中石子最多的玩家獲勝。

假設亞歷克斯和李都發揮出最佳水平,當亞歷克斯贏得比賽時返回true,當李贏得比賽時返回false。

示例:

輸入:[5,3,4,5]
輸出:true
解釋:
亞歷克斯先開始,只能拿前 5 顆或後 5 顆石子 。
假設他取了前 5 顆,這一行就變成了 [3,4,5] 。
如果李拿走前 3 顆,那麼剩下的是 [4,5],亞歷克斯拿走後 5 顆贏得 10 分。
如果李拿走後 5 顆,那麼剩下的是 [3,4],亞歷克斯拿走後 4 顆贏得 9 分。
這表明,取前 5 顆石子對亞歷克斯來說是一個勝利的舉動,所以我們返回 true 。

題解:

奇偶數對

我們設陣列總長度為n,並且已知n%2 == 0:

當先手取第一位時,剩下的位置是 2~n, 後手能取的位置為2或n,都為偶數位置。 後手取後總長度變為n-2,產生遞迴。
當先手取最後一位時,.......,後手只能取1或n-1,都為奇數位置。 後手取......遞迴。
不難看出,先手取的位置必定限制了後手能取的位置,即: 先手取首位後手只能取偶數位,先手取末位後手只能取奇數位。 因此先手只需要計算好奇偶數位總和,則必贏。

https://leetcode-cn.com/problems/stone-game/solution/wei-shi-yao-zong-wei-true-by-xxx_-2-jes7/

class Solution {
public:
    bool stoneGame(vector<int>& piles) {
     /* int l=piles.size();
      int x=0,y=0;
      int i=0,j=l-1;
      while(i<j)
      //for(int t=1;t<=l/2;t++)
      {
        if(piles[i+1]+piles[j]>piles[i]+piles[j-1]) {x+=piles[j]; j--;}
           else {x+=piles[i]; i++;}
        if (i!=j)
        {
            if(piles[i+1]+piles[j]>piles[i]+piles[j-1]) {y+=piles[j]; j--;}
           else {y+=piles[i]; i++;}
        }  else y+=piles[i];
      }
     bool res;
      if (x>y) res=true;
        else res= false;
      return res;
*/ //錯誤做法,錯誤 return true; } };