给定 N 行的形式为 a*x + b*y = c(a>0 或 a==0 & b>0)。求在一点相交的线对的数量。
例子:
Input: N=5
x + y = 2
x + y = 4
x = 1
x – y = 2
y = 3
Output: 9
Input: N=2
x + 2y = 2
x + 2y = 4
Output: 0
方法:
- 平行线永远不会相交,因此需要一种方法来排除每条线的平行线。
- 直线的斜率可以表示为pair(a, b)。构建一个以键为斜率、以 c 为条目的集合的映射,以便它具有平行线的帐户。
- 遍历行将它们添加到地图并维护一个变量Tot来计算到目前为止的总行数。
- 现在,对于每一行,更新Tot变量,然后将Tot添加到答案中,并减去该行的平行线数,包括其自身。
下面是上述方法的实现:
// C++ implementation to calculate
// pair of intersecting lines
#include
using namespace std;
// Function to return the number
// of intersecting pair of lines
void numberOfPairs(int a[],int b[],int c[],int N){
int count = 0, Tot = 0;
// Construct a map of slope and
// corresponding c value
map, set > LineMap;
// iterate over each line
for (int i = 0; i < N; i++) {
// Slope can be represented
// as pair(a, b)
pair Slope =
make_pair(a[i], b[i]);
// Checking if the line does
// not already exist
if (!LineMap[Slope].count(c[i])){
// maintaining a count
// of total lines
Tot++;
LineMap[Slope].insert(c[i]);
// subtracting the count of
// parallel lines including itself
count += Tot -
LineMap[Slope].size();
}
}
cout << count << endl;
}
// Driver code
int main()
{
// A line can be represented as ax+by=c
// such that (a>0 || (a==0 & b>0) )
// a and b are already in there lowest
// form i.e gcd(a, b)=1
int N = 5;
int a[] = { 1, 1, 1, 1, 0 };
int b[] = { 1, 1, 0, -1, 1 };
int c[] = { 2, 4, 1, 2, 3 };
numberOfPairs(a,b,c,N);
return 0;
}
输出:
9
时间复杂度:
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。