แนวคิด
ด้วยความเคารพต่ออาร์เรย์ arr[] ของจำนวนเต็มบวก n จำนวนที่กำหนด ภารกิจคือการกำหนดองค์ประกอบ arr[i] และ arr[j] จากอาร์เรย์เพื่อให้ arr[i]Carr[j] เป็นไปได้มากที่สุด สำหรับคู่ที่ถูกต้องมากกว่า 1 คู่ ให้พิมพ์คู่ใดคู่หนึ่ง
ป้อนข้อมูล
arr[] = {4, 1, 2} ผลผลิต
4 2 4C1 = 4 4C2 = 4 2C1 = 4 (4, 2) is the only pairs with maximum nCr.
วิธีการ
น Cr ถือเป็นฟังก์ชันการเพิ่มแบบโมโนโทนิก นั่นคือ n+1 Cr> n Cr . เราสามารถประยุกต์ใช้ข้อเท็จจริงนี้เพื่อเข้าใกล้คำตอบของเรา เราจะเลือกค่า n สูงสุดจากจำนวนเต็มที่กำหนด ด้วยวิธีนี้เราจึงกำหนดค่าของ n.
ตอนนี้ เรามีสมาธิสำหรับ r อย่างที่เราทราบกันดีว่า n Cr = น Cn-r แสดงว่า nCr จะถึงจุดสูงสุดก่อนแล้วจึงลดลง
สำหรับค่าคี่ของ n ค่าสูงสุดของเราจะเกิดที่ n / 2 และ n / 2 + 1
ด้วยความเคารพของ n =11 เราจะได้ค่าสูงสุดที่ 11 C5 และ 11 C6 .
สำหรับค่าที่เท่ากันของ n ค่าสูงสุดของเราจะเกิดที่ n / 2
ด้วยความเคารพของ n =4 เราจะได้ค่าสูงสุดที่ 4 C2
ตัวอย่าง
// This is C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
// Now Function to print the pair that gives maximum nCr
void printMaxValPair1(vector<long long>& v1, int n1){
sort(v1.begin(), v1.end());
// This provides the value of N in nCr
long long N1 = v1[n1 - 1];
// Case 1 : When N1 is odd
if (N1 % 2 == 1) {
long long first_maxima1 = N1 / 2;
long long second_maxima1 = first_maxima1 + 1;
long long ans1 = 3e18, ans2 = 3e18;
long long from_left1 = -1, from_right1 = -1;
long long from = -1;
for (long long i = 0; i < n1; ++i) {
if (v1[i] > first_maxima1) {
from = i;
break;
}
else {
long long diff = first_maxima1 - v1[i];
if (diff < ans1) {
ans1 = diff;
from_left1 = v1[i];
}
}
}
from_right1 = v1[from];
long long diff1 = first_maxima1 - from_left1;
long long diff2 = from_right1 - second_maxima1;
if (diff1 < diff2)
cout << N1 << " " << from_left1;
else
cout << N1 << " " << from_right1;
}
// Case 2 : When N1 is even
else {
long long maxima = N1 / 2;
long long ans1 = 3e18;
long long R = -1;
for (long long i = 0; i < n1 - 1; ++i) {
long long diff = abs(v1[i] - maxima);
if (diff < ans1) {
ans1 = diff;
R = v1[i];
}
}
cout << N1 << " " << R;
}
}
// Driver code
int main(){
vector<long long> v1 = { 1, 1, 2, 3, 6, 1 };
int n1 = v1.size();
printMaxValPair1(v1, n1);
return 0;
} ผลลัพธ์
6 3