C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

破棄後にカードの最小合計を取得するC++コード


配列Tに5つの数字があるとします。5枚のカードがあり、各カードには数字が書かれています。 i番目のカードにはT[i]が書かれています。いくつかのカードを捨てることができます。私たちの目標は、残りの数字に書かれている数字の合計を最小限に抑えることです。彼は多くても同じ番号のカードを2枚か3枚捨てることができます。同じ番号のカードを2枚か3枚選ぶことができない場合、カードを捨てることはありません。可能な限り最小の合計を見つける必要があります。

したがって、入力がT =[7、3、7、3、20]の場合、番号7の2枚のカードを削除すると、出力は26になります。残りの合計は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

  1. C++でNを除数で繰り返し除算した後の最大合計

    この問題では、整数Nが与えられます。私たちのタスクは、C++でNを除数で繰り返し除算した後に最大の合計を見つけるプログラムを作成することです。 プログラムの説明 −数Nを1になるまで再帰的に除算してから、すべての約数を合計し、すべての約数の最大値を求めます。 問題を理解するために例を見てみましょう 入力 − n =12 出力 − 22 説明 −数値を再帰的に除算して、合計を求めましょう。 Division 1: 12/2 = 6 Division 2: 6/2 = 3 Division 3: 3/3 = 1 Sum = 12+6+3+1 = 22 この問題を解決するために、Nを

  2. C++の三角形の最小合計パス

    問題の説明 数字の三角形の構造が与えられた場合、上から下への最小経路合計を見つけます。各ステップで、下の行の隣接する番号に移動できます。 例 入力が-の場合    5   7 3  8 1 2 9 6 4 5 その場合、最小合計は次のように13です- 5 + 3 + 1 + 4 アルゴリズム 動的計画法の暗記手法を使用する 暗記、つまり暗記用の1次元配列を作成します K行ごとに、以下の式を使用します- memorization[i] = min( memorization[i], memorization[i+1]) + A[k][i];