獲得最小卡牌和數


假設我們在陣列 T 中有五個數字。有五張卡,每張卡上都寫了一個數字。第 i 張卡上寫著 T[i]。我們可以丟棄一些卡,我們的目標是使剩餘數字中的數字之和小於最小值。他最多可以丟棄兩張或三張帶有相同數字的卡牌。如果無法選擇兩張或三張帶有相同數字的卡牌,我們將不會丟棄卡牌。我們必須找到儘可能小的最小和。

因此,如果輸入如 T = [7, 3, 7, 3, 20],則輸出將為 26,因為刪除了兩張數字為 7 的卡。剩餘之和將為 3 + 3 + 20 = 26。

步驟

為了解決這個問題,我們將按照以下步驟執行操作 −

n := 5
m := 0
Define an array k of size: 101 and fill with 0
for initialize i := 0, when i < n, update (increase i by 1), do:
   a := T[i]
   m := m + a
   (increase k[a] by 1)
M := m
for initialize i := 0, when i < 101, update (increase i by 1), do:
   if k[i] > 1, then:
      M := minimum of M and (m - i * (minimum of 3 and k[i]))
return M

示例

讓我們看看以下實現以獲得更好的理解 −

#include <bits/stdc++.h>
using namespace std;
int solve(vector<int> T){
   int n = 5, m = 0, a;
   int k[101] = { 0 };
   for (int i = 0; i < n; i++){
      int a = T[i];
      m += a;
      k[a]++;
   }
   int M = m;
   for (int i = 0; i < 101; i++)
      if (k[i] > 1){
         M = min(M, m - i * (min(3, k[i])));
      }
   return M;
}
int main(){
   vector<int> T = { 7, 3, 7, 3, 20 };
   cout << solve(T) << endl;
}

輸入

{ 7, 3, 7, 3, 20 }

輸出

26

更新於: 2022 年 3 月 29 日

121 次瀏覽

開啟你的事業

開始學習
廣告