Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

รหัส C ++ เพื่อรับจำนวนการ์ดขั้นต่ำหลังจากทิ้ง


สมมติว่าเรามีตัวเลขห้าตัวในอาร์เรย์ T มีไพ่ห้าใบและแต่ละใบมีตัวเลขเขียนอยู่ การ์ด ith มี 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