Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình tìm số hoạt động cần thiết để tạo các cặp từ cạnh đầu tiên và cuối cùng có tổng bằng nhau trong Python

Giả sử chúng ta có một danh sách các số được gọi là nums. Độ dài của danh sách này là thậm chí. Bây giờ hãy xem xét một phép toán trong đó chúng ta chọn bất kỳ số nào trong nums và cập nhật nó với một giá trị trong phạm vi [1 và tối đa là nums]. Chúng ta phải tìm số lượng tối thiểu các phép toán như vậy được yêu cầu sao cho với mọi i, nums [i] + nums [n-1-i] bằng cùng một số.

Vì vậy, nếu đầu vào giống như nums =[8,6,2,5,9,2], thì đầu ra sẽ là 2, bởi vì nếu chúng ta thay đổi 2 đầu tiên tại nums [2] thành 5 và 9 tại nums [4 ] đến 4, thì các phần tử sẽ là [8,6,5,5,4,2], sau đó nums [i] + nums [n-1-i] cho mỗi i sẽ là (8 + 2) =( 6 + 4) =(5 + 5) =10.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • N:=kích thước của nums
  • mx:=tối đa là nums
  • sự kiện:=một danh sách mới
  • idx:=0
  • while idx
  • a:=nums [idx]
  • b:=nums [N - idx - 1]
  • chèn một cặp (tối thiểu là (a + 1), (b + 1), 1) vào cuối sự kiện
  • chèn một cặp (a + b, 1) vào cuối sự kiện
  • chèn một cặp (a + b + 1, -1) vào cuối sự kiện
  • chèn một cặp (tối đa là (a + mx) và (b + mx + 1), -1) vào cuối sự kiện
  • idx:=idx + 1
  • sắp xếp các sự kiện trong danh sách
  • hiện tại:=0
  • mx_same:=0
  • đối với mỗi cặp (sự kiện, đồng bằng) trong các sự kiện, thực hiện
    • current:=current + delta
    • mx_same:=tối đa hiện tại và mx_same
  • trả về N - mx_same
  • Ví dụ

    Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

    def solve(nums):
       N = len(nums)
       mx = max(nums)
       events = []
    
       idx = 0
       while idx < N // 2:
          a = nums[idx]
          b = nums[N - idx - 1]
    
          events.append((min(a + 1, b + 1), 1))
          events.append((a + b, 1))
          events.append((a + b + 1, -1))
          events.append((max(a + mx, b + mx) + 1, -1))
    
       idx += 1
    
       events.sort()
       current = 0
       mx_same = 0
    
       for event, delta in events:
          current += delta
          mx_same = max(current, mx_same)
    
       return N - mx_same
    
    nums = [8,6,2,5,9,2]
    print(solve(nums))

    Đầu vào

    [6, 8, 5, 2, 3]

    Đầu ra

    2