สมมติว่าเรามีตัวเลขห้าตัวในอาร์เรย์ 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