สมมุติว่าเรามี n ทีมและเรามักจะจัดทีมที่ค่อนข้างแข็งแกร่งให้เล่นกับทีมที่ค่อนข้างอ่อนแอ เช่น ให้ทีมอันดับ 1 เล่นกับทีมที่มีอันดับ n กลยุทธ์นี้จะทำให้การแข่งขันน่าสนใจยิ่งขึ้น ตอนนี้เราต้องหาแมตช์สุดท้ายของการแข่งขันในรูปแบบของสตริง
ทีมเหล่านี้จะได้รับในรูปแบบของจำนวนเต็มบวกตั้งแต่ 1 ถึง n ซึ่งแสดงถึงอันดับเริ่มต้น ดังนั้น อันดับ 1 คือทีมที่แข็งแกร่งที่สุด และอันดับ n คือทีมที่อ่อนแอที่สุด เราจะใช้วงเล็บและลูกน้ำเพื่อแสดงการจับคู่ทีมแข่งขัน - วงเล็บ ('(', ')') สำหรับการจับคู่ และเครื่องหมายจุลภาค (',') สำหรับการแบ่งพาร์ติชัน ในระหว่างกระบวนการจับคู่ในแต่ละรอบ เรามักจะต้องปฏิบัติตามกลยุทธ์ในการสร้างคู่ที่แข็งแกร่งกับคู่ที่อ่อนแอ
ดังนั้น หากอินพุตเท่ากับ 4 เอาต์พุตจะเป็น ((1,4), (2,3))
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน create() ซึ่งจะใช้เวลาต่ำ สูง อาร์เรย์ v2 อาร์เรย์ v1
-
ถ้าต่ำ>=สูง แล้ว −
-
กลับ
-
-
แทรก "(" concatenate v1[low] concatenate "," concatenate v1[high] concatenate ") ที่ส่วนท้ายของ v2
-
สร้าง(ต่ำ + 1, สูง - 1, v2, v1)
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
กำหนดอาร์เรย์ v1, v2
-
สำหรับการเริ่มต้น i :=1 เมื่อฉัน <=n อัปเดต (เพิ่ม i ขึ้น 1) ทำ -
-
แทรกแปลง i เป็นสตริงที่ส่วนท้ายของ v1
-
-
ในขณะที่ขนาดของ v1> 1 ทำ -
-
สร้าง(0, ขนาดของ v1, v2, v1)
-
v1 :=v2
-
ล้างอาร์เรย์ v2
-
-
คืนค่าองค์ประกอบสุดท้ายของ v1
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
void create(int low, int high, vector <string>& v2, vector <string>& v1){
if (low >= high)
return;
v2.push_back("(" + v1[low] + "," + v1[high] + ")");
create(low + 1, high - 1, v2, v1);
}
string findContestMatch(int n) {
vector v1, v2;
for (int i = 1; i <= n; i++) {
v1.push_back(to_string(i));
}
while (v1.size() > 1) {
create(0, v1.size() - 1, v2, v1);
v1 = v2;
v2.clear();
}
return v1.back();
}
};
main(){
Solution ob;
cout << (ob.findContestMatch(4));
} อินพุต
4
ผลลัพธ์
((1,4),(2,3))