在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。
如果我们查看给定的照片,则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
- 如果c[x] > 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
- 如果x与prv相同,则
- 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
- 如果x与prv相同,则
- 返回列表(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