สมมติว่าเรากำลังสร้างหุ่นยนต์ทำความสะอาดที่ทำงานบนกริด กริดมีขนาด h x w มีเซลล์สกปรก m เซลล์ที่ต้องทำความสะอาดซึ่งกำหนดในอาร์เรย์ของคู่จำนวนเต็ม 'dirt' หุ่นยนต์ทำความสะอาด หากวางอยู่ในเซลล์เฉพาะ จะทำความสะอาดทุกเซลล์ในแถวและคอลัมน์นั้นๆ ดังนั้น ภารกิจของเราคือทำความสะอาดเซลล์สกปรกให้ได้มากที่สุด เราต้องหาจำนวนและแสดงเป็นผลลัพธ์
ดังนั้น หากอินพุตเป็น h = 3, w = 3, m = 3, dirt = {{0, 0}, {1, 1}, {2, 1}} ผลลัพธ์จะเป็น 3 หากเราวางหุ่นยนต์ทำความสะอาดที่เซลล์ {1, 0} มันจะสามารถทำความสะอาดเซลล์สกปรกทั้งหมดในกริดได้
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนต่อไปนี้ -
กำหนดแมปหนึ่ง
กำหนดอาร์เรย์ hcount และ wcount ขนาด: 100 และเริ่มต้นด้วย 0
maxh = 0, maxw = 0, res = 0
กำหนดอาร์เรย์ p, q
สำหรับ i := 0, เมื่อ i < m, เพิ่ม i ขึ้นทีละ 1, ทำ:
a := ค่าแรกของ dirt[i]
b := ค่าที่สองของ dirt[i]
pairMap[คู่ (a, b)] := 1
(เพิ่ม hcount[a] ขึ้น 1)
(เพิ่ม wcount[b] ขึ้น 1)
สำหรับ i := 0, เมื่อ i < h, เพิ่ม i ขึ้นทีละ 1, ทำ:
maxh := สูงสุดของ maxh และ hcount[i]
สำหรับ i := 0, เมื่อ i < w, เพิ่ม i ขึ้นทีละ 1, ทำ:
maxw := สูงสุดของ maxw และ wcount[i]
สำหรับ i := 0, เมื่อ i < h, เพิ่ม i ขึ้นทีละ 1, ทำ:
ถ้า hcount[i] เท่ากับ maxh, แล้ว:
ใส่ i ที่ท้ายของ p
สำหรับ i := 0, เมื่อ i < w, เพิ่ม i ขึ้นทีละ 1, ทำ:
ถ้า wcount[i] เท่ากับ maxw, แล้ว:
ใส่ i ที่ท้ายของ q
สำหรับแต่ละองค์ประกอบ i ใน p, ทำ:
สำหรับแต่ละองค์ประกอบ j ใน q, ทำ:
ถ้า pairMap[คู่ (i, j)] ไม่เป็นศูนย์, แล้ว:
res := maxh + maxw - 1
มิฉะนั้น
res := maxh + maxw
return res
return res
ตัวอย่าง
ลองดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; const int INF = 1e9; int solve(int h, int w, int m, vector<pair<int, int>> dirt){ map<pair<int, int>, int> pairMap; int hcount[100] = {0}, wcount[100] = {0}, maxh = 0, maxw = 0, res = 0; vector<int>p, q; for (int i = 0; i < m; i++) { int a = dirt[i].first; int b = dirt[i].second; pairMap[make_pair(a, b)] = 1; hcount[a]++; wcount[b]++; } for (int i = 0; i < h; i++) maxh = max(maxh, hcount[i]); for (int i = 0; i < w; i++) maxw = max(maxw, wcount[i]); for (int i = 0; i < h; i++){ if (hcount[i] == maxh) p.push_back(i); } for (int i = 0; i < w; i++) { if (wcount[i] == maxw) q.push_back(i); } for (auto i : p) { for (auto j : q) { if (pairMap[make_pair(i, j)]) res = maxh + maxw - 1; else { res = maxh + maxw; return res; } } } return res; } int main() { int h = 3, w = 3, m = 3; vector<pair<int, int>> dirt = {{0, 0}, {1, 1}, {2, 1}}; cout<< solve(h, w, m, dirt); return 0; }
อินพุต
3, 3, 3, {{0, 0}, {1, 1}, {2, 1}}
เอาต์พุต
3