สมมติว่าเรามีอาร์เรย์ A ขนาด n n เป็นเลขคู่ A[i] คือตัวเลขบนไพ่ ใบที่ i มี n/2 คนอยากเล่น ตอนเริ่มแต่ละคนรับ 2 ใบ ต้องหาวิธีแจกไพ่ให้ผลรวมตัวเลขบนไพ่เท่ากันทุกคน
เช่น ถ้าอินพุตคือ A = [1, 5, 7, 4, 4, 3] เอาต์พุตจะเป็น [(0, 2), (5, 1), (3, 4)] เพราะ A[0]+A[2]=8, A[5]+A[1]=8, A[3]+A[4]=8
ขั้นตอนการแก้ปัญหา
n := ขนาดของ A
กำหนดอาร์เรย์คู่ p ขนาด n
for i := 0 ถึง n-1:
p[i].first := A[i]
p[i].second := i
เรียงลำดับ p
for i := 0 ถึง n/2 - 1:
print p[i].second และ p[n-i-1].second
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
void solve(vector<int> A) {
int n = A.size();
pair<int, int> p[n];
for (int i = 0; i < n; i++) {
p[i].first = A[i];
p[i].second = i;
}
sort(p, p + n);
for (int i = 0; i < n / 2; i++)
cout << "(" << p[i].second << ", " << p[n - i - 1].second << "), ";
}
int main() {
vector<int> A = { 1, 5, 7, 4, 4, 3 };
solve(A);
}
อินพุต
{ 1, 5, 7, 4, 4, 3 }
เอาต์พุต
(0, 2), (5, 1), (3, 4),