Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ นับว่าลดความยาวสายต่อคอมได้กี่วิธี


สมมติว่าเรามีอาร์เรย์ A และ B สองอาร์เรย์ที่มีองค์ประกอบ N พิจารณาว่ามีคอมพิวเตอร์ N และซ็อกเก็ต N พิกัดของคอมพิวเตอร์ ith คือ A[i] และพิกัดของซ็อกเก็ต ith คือ b[i] พิกัด 2N เหล่านี้มีความแตกต่างกันเป็นคู่ เราต้องการเชื่อมต่อคอมพิวเตอร์แต่ละเครื่องกับซ็อกเก็ตด้วยสายเคเบิล แต่ละซ็อกเก็ตสามารถเชื่อมต่อกับคอมพิวเตอร์ได้ไม่เกินหนึ่งเครื่อง เราต้องนับว่าเราสามารถลดความยาวของสายเคเบิลได้หลายวิธี หากคำตอบมีขนาดใหญ่เกินไป ให้คืนค่า mod ผลลัพธ์ 10^9 + 7

ดังนั้น หากอินพุตเป็น A =[0, 10]; B =[20, 30] ดังนั้นเอาต์พุตจะเป็น 2 เนื่องจากมีการเชื่อมต่อที่เหมาะสมที่สุดสองแบบ (0 ถึง 20, 10 ถึง 30) และ (0 ถึง 30, 10 ถึง 20) ในทั้งสองกรณี ความยาวรวมของสายเคเบิลคือ 40

ขั้นตอน

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

maxn := 200005
p := 10^9 + 7
Define one array of pair for integer type elements
n := size of A
for initialize i := 0, when i < n, update (increase i by 1), do:
   first element of a[i] := A[i]
   second element of a[i] := 1
for initialize i := n, when i < 2 * n, update (increase i by 1), do:
   first element of a[i] := B[i - n]
   second element of a[i] := -1
sort the array a
ways := 1, val = 0
for initialize i := 0, when i < 2 * n, update (increase i by 1), do:
   if val * second element of a[i] < 0, then:
      ways := ways * |val|
   val := val + (second element of a[i])
return ways

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#include <bits/stdc++.h>
using namespace std;

int solve(vector<int> A, vector<int> B){
   long maxn = 200005;
   long p = 1000000007;
   pair<int, int> a[maxn];
   int n = A.size();
   for (int i = 0; i < n; i++){
      a[i].first = A[i];
      a[i].second = 1;
   }
   for (int i = n; i < 2 * n; i++){
      a[i].first = B[i - n];
      a[i].second = -1;
   }
   sort(a, a + 2 * n);
   long long ways = 1, val = 0;
   for (int i = 0; i < 2 * n; i++){
      if (val * a[i].second < 0){
         ways = ways * abs(val) % p;
      }
      val += a[i].second;
   }
   return ways;
}
int main(){
   vector<int> A = { 0, 10 };
   vector<int> B = { 20, 30 };
   cout << solve(A, B) << endl;
}

อินพุต

{ 0, 10 }, { 20, 30 }

ผลลัพธ์

2