กำหนดให้มีรายชื่อรายการ TV shows และระยะเวลาที่ดูแต่ละรายการ พร้อมกับจำนวนเต็ม k โดย shows[i] และ duration[i] แสดงชื่อและระยะเวลาที่บุคคลที่ i ดู เราต้องหาผลรวมระยะเวลาของ k รายการที่มีระยะเวลาสะสมมากที่สุด
ตัวอย่าง: shows = ["Castle Play", "Fairy Tale Series", "Castle Play", "Jerry Mouse", "Rich Boy"], duration = [6, 4, 6, 14, 5], k = 2 ผลลัพธ์คือ 26 (Castle Play: 12, Jerry Mouse: 14)
วิธีแก้ปัญหา
- ใช้
mapรวมระยะเวลาตามชื่อรายการ - นำค่าระยะเวลาที่รวมแล้วใส่ array และเรียงจากมากไปน้อย
- รวมค่า
kอันดับแรก
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int solve(vector<string>& v, vector<int>& d, int k) {
map<string, int> m;
for(int i = 0; i < v.size(); i++)
m[v[i]] += d[i];
vector<int> arr;
for(auto& it : m)
arr.push_back(it.second);
sort(arr.rbegin(), arr.rend());
int ret = 0;
for(int i = 0; i < k; i++)
ret += arr[i];
return ret;
}
};
int main() {
vector<string> v = {"Castle Play", "Fairy Tale Series", "Castle Play", "Jerry Mouse", "Rich Boy"};
vector<int> v1 = {6, 4, 6, 14, 5};
Solution ob;
cout << (ob.solve(v, v1, 2));
}
Input
{"Castle Play", "Fairy Tale Series", "Castle Play", "Jerry Mouse", "Rich Boy"}, {6, 4, 6, 14, 5}, 2
Output
26