返回列表 發帖

202404新手2-撲克


撲克 (Poker)
問題敘述
過年期間,打牌是許多家庭的傳統活動。今年,當你從櫃子中翻出已久未用的撲克牌時,一個意外發生了。
由於存放撲克牌的盒子過於老舊,當你拿它出來時,牌散落了一地。
更麻煩的是,盒子裡不只放著一副撲克牌,而是混合了多副牌。你好不容易撿起你見到的每一張牌,但有些牌好像掉進櫃子間的縫隙了,你不確定現在到底能湊出幾副牌。 一副「完整牌組」包含52張牌,分為四個花色:紅心、方塊、梅花與黑桃。每個花色包含從2到10的數字牌,以及J、Q、K、A共13張牌。為了方便起見,撲克以1到52編號。
請撰寫一個程式,分析一堆混在一起的撲克牌,輸出: (1) 在不增加任何牌的情況下,以目前的牌最多能湊出幾副完整牌組; (2) 若要用上所有現有的牌去湊出完整牌組,最少還需要補幾張牌。

範例1
總共有10張牌,湊不出一副完整的牌,還需要補42張牌。
範例2:總共有53張牌,其中可以湊出一副完整的牌,還需要補51張以湊出第二副牌。
範例3:總共有3張牌,有三張1,所以要湊出三副完整的牌,因此還需要補153張。
評分說明
此題目測資分為兩組,每組測資有多筆測試資料,需答對該組所有測資才能獲得該組分數,各組詳細限制如下。
第一組(20 分):輸入保證每個編號只會出現最多一次。
第二組(30 分):補的牌數量不會超過51張。 第三組(50 分):無特殊限制。
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊
May

  1. #include<bits/stdc++.h>
  2. using namespace std;

  3. int main()
  4. {
  5.     int n;
  6.     cin >>n;
  7.     vector<int> cards(n);
  8.     // 紀錄各張牌的數量
  9.     vector<int> cardsCounter(53, 0);
  10.     for (int i = 0; i < n; i++)
  11.     {
  12.         cin >> cards[i];
  13.         // 計算各張牌的數量
  14.         ++cardsCounter[cards[i]];
  15.     }


  16.     // 找到數量最多和最少的牌(同花色)
  17.     int maxCount = 0;
  18.     int minCount = 1000;
  19.     for (int i = 1; i <= 52; i++)
  20.     {
  21.         if (cardsCounter[i] > maxCount)
  22.         {
  23.             maxCount = cardsCounter[i];
  24.         }
  25.         if (cardsCounter[i] < minCount)
  26.         {
  27.             minCount = cardsCounter[i];
  28.         }
  29.     }

  30.     // minCount 是數量最少的花色的牌數,表示最少有 minCount 副牌
  31.     // 要湊成完整的牌至少要 maxCount 副牌,總共會有 maxCount * 52 張
  32.     // 還需要補的牌數量為 maxCount * 52 - n
  33.     cout << minCount << " " << (maxCount * 52) - n << endl;

  34. }
  35. /*
  36. 10
  37. 1 2 3 4 5 6 7 8 9 10
  38. 輸出
  39. 0 42
  40. */
複製代碼
回復 1# may
May

TOP

返回列表