Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 최대 건물 높이를 찾는 프로그램

<시간/>

값 n과 제한이라는 또 다른 쌍 목록이 있다고 가정합니다. 우리는 도시에 n개의 새로운 건물을 짓고 싶습니다. 그러나 몇 가지 제한 사항이 있습니다. 우리는 한 줄로 지을 수 있고 건물은 1에서 n까지 레이블이 지정됩니다. 제한에는 두 개의 매개변수가 있으므로 제한[i] =(id_i, max_height_i)은 id_i의 높이가 max_height_i보다 작거나 같아야 함을 나타냅니다. 새 건물의 높이에 대한 도시 제한은 다음과 같습니다 -

  • 각 건물의 높이는 0 또는 양수 값이어야 합니다.

  • 첫 번째 건물 높이는 0이어야 합니다.

  • 인접한 두 건물의 높이 차이는 1을 초과할 수 없습니다.

가장 높은 건물의 가능한 최대 높이를 찾아야 합니다.

따라서 입력이 n =5, 제한 =[[2,1],[4,3]]인 경우 가능한 최대 높이를 찾아야 하기 때문에 출력은 4가 됩니다. 따라서 다음과 같이 4가 될 수 있습니다. 도표.

Python에서 최대 건물 높이를 찾는 프로그램

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 제한이 비어 있으면

    • n-1 반환

  • resi :=id에 따라 목록 제한 정렬

  • k :=0

  • 아이디:=1

  • resi의 각 re에 대해 수행

    • re[1] :=re[1] 및 (k+re[0]-idx)의 최소값

    • k :=re[1]

    • idx :=re[0]

  • k :=resi의 마지막 요소의 최대 높이

  • idx :=resi의 마지막 요소 ID

  • 목록 뒤집기

  • 첫 번째 항목부터 각 항목에 대해 다음을 수행하십시오.

    • re[1] :=re[1] 및 (k-re[0]+idx)의 최소값

    • k :=re[1]

    • idx :=re[0]

  • 목록 뒤집기

  • f :=0

  • 아이디:=1

  • 해상도 :=0

  • resi의 각 re에 대해 수행

    • ff :=(f+re[0]-idx) 및 re[1]의 최소값

    • res :=res의 최대값과 (re[0] - idx + f + ff)/2의 몫

    • idx :=re[0]

    • f :=f

  • (f+n-idx) 및 res

    의 최대값을 반환합니다.

예시

더 나은 이해를 위해 다음 구현을 살펴보겠습니다.

def solve(n, restrictions):
   if not restrictions:
      return n-1
   resi = sorted(restrictions, key = lambda x:x[0])

   k = 0
   idx = 1
   for re in resi:
      re[1] = min(re[1], k+re[0]-idx)
      k = re[1]
      idx = re[0]
   k = resi[-1][1]
   idx = resi[-1][0]
   resi.reverse()
   for re in resi[1:]:
      re[1] = min(re[1], k-re[0]+idx)
      k = re[1]
      idx = re[0]
   resi.reverse()

   f = 0
   idx = 1
   res = 0
   for re in resi:
      ff = min(f+re[0]-idx, re[1])
      res = max(res, (re[0] - idx + f + ff) // 2)
      idx = re[0]
      f = ff
   return max(f+n-idx,res)

n = 5
restrictions = [[2,1],[4,3]]
print(solve(n, restrictions))

입력

5, [[2,1],[4,3]]

출력

4