在Python中计算有多少行相交的程序

在Python中计算有多少行相交的程序

假设我们有一个包含(m, c)值对的列表。这些值表示一条直线,其中y = mx + c。我们还给出了两个值l和r。我们需要找出在x = l到x = h的范围内相互相交的行数。

因此,如果输入为input_list = [[4, 6],[-6, 10],[8, 12]],l = 0,h = 2,则输出将为2。

在Python中计算有多少行相交的程序

如果我们查看给定的照片,则4x + 6 = 0和-6x + 10的交点在给定范围内。因此,有两行相交,因此输出为2。

要解决此问题,我们将遵循以下步骤:

  • seg:一个列表,包含对于输入列表中的索引i和值(m,c),[(m * l + c,m * h + c,i)]
  • 对列表seg进行排序
  • ans:大小为输入列表的新列表,包含0
  • c:从seg创建一个新的映射
  • 对于seg中的每个(x,y,i),进行如下操作:
    • 如果c[x] > 1,则
      • ans[i] = 1
  • max_c = -(10 ** 10)
  • prv = -(10 ** 10)
  • 对于seg中的每个(x,y,i),进行如下操作:
    • 如果x与prv相同,则
      • ans[i] = 1
    • 如果y <= max_c,则
      • ans[i] = 1
    • max_c =(max_c,y)的最大值
      • prv = x
  • min_c = 10 ** 10
  • prv = 10 ** 10
  • 对于seg中的每个(x,y,i),进行如下操作:
    • 如果x与prv相同,则
      • ans[i] = 1
    • 如果y >= min_c,则
      • ans[i] = 1
    • min_c =(min_c,y)的最小值
    • prv = x
  • 返回列表(ans)中元素的总和

示例

以下是实现的代码,以便更好地理解:

from collections import Counter

def solve(input_list, l, h):
   seg = [(m * l + c, m * h + c, i) for i, (m, c) in
enumerate(input_list)]
   seg.sort()
   ans = [0 for _ in input_list]
   c = Counter(seg)
   for (x, y, i) in seg:
      if c[x] > 1:
         ans[i] = 1
   max_c = -(10 ** 10)
   prv= -(10 ** 10)
   for (x, y, i) in seg:
      if x == prv:
         ans[i]= 1
      if y <= max_c:
         ans[i] = 1
      max_c = max(max_c, y)
      prv = x
   min_c = 10 ** 10
   prv = 10 ** 10
   for (x, y, i) in seg[::-1]:
      if x == prv:
         ans[i] = 1
      if y >= min_c:
         ans[i] = 1
      min_c = min(min_c, y)
      prv = x
   return sum(ans)

print(solve([[4, 6],[-6, 10],[8, 12]], 0, 2))

输入

[[4, 6],[-6, 10],[8, 12]], 0, 2

输出

2

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程