Python
 Computer >> コンピューター >  >> プログラミング >> Python

最初と最後の側からペアを作るために必要な操作の数を見つけるためのプログラムは、Pythonで同じ合計です


numsという番号のリストがあるとします。このリストの長さは偶数です。ここで、numsで任意の数値を選択し、[1および最大nums]の範囲の値で更新する操作について考えてみます。すべてのiについて、nums [i] +nums[n-1-i]が同じ数になるように必要なそのような操作の最小数を見つける必要があります。

したがって、入力がnums =[8,6,2,5,9,2]のようである場合、出力は2になります。これは、最初の2をnums [2]で5に変更し、9をnums[4で変更するためです。 ]を4にすると、要素は[8,6,5,5,4,2]になり、各iのnums [i] + nums [n-1-i]は(8 + 2)=( 6 + 4)=(5 + 5)=10。

これを解決するには、次の手順に従います-

  • N:=numsのサイズ
  • mx:=最大数
  • イベント:=新しいリスト
  • idx:=0
  • idx
  • a:=nums [idx]
  • b:=nums [N --idx-1]
  • イベントの最後にペア((a + 1)、(b + 1)、1以上)を挿入します
  • イベントの最後にペア(a + b、1)を挿入します
  • イベントの最後にペア(a + b + 1、-1)を挿入します
  • イベントの最後にペア(最大(a + mx)と(b + mx + 1)、-1)を挿入します
  • idx:=idx + 1
  • リストイベントを並べ替える
  • 現在:=0
  • mx_same:=0
  • イベントの各ペア(イベント、デルタ)について、
    • 現在:=現在+デルタ
    • mx_same:=現在の最大値とmx_same
  • return N --mx_same
  • 理解を深めるために、次の実装を見てみましょう-

    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))

    入力

    [6, 8, 5, 2, 3]

    出力

    2

    1. Pythonの最初から最後のノードまでの制限されたパスの数を見つけるプログラム

      無向加重連結グラフが1つあるとします。グラフにはn個のノードがあり、1からnまでのラベルが付けられています。開始から終了までのパスは、[z0、z1、z2、...、zk]のようなノードのシーケンスです。ここで、z0は開始ノード、zkは終了ノードであり、ziとzi+1の間にエッジがあります。ここで0<=i dist(zi + 1)(0 <=i <=k-1)も満たす特別なパスです。したがって、ノード1からノードnまでの制限されたパスの数を見つける必要があります。答えが大きすぎる場合は、10 ^ 9+7を法として答えを返します。 したがって、入力が次のような場合 3つの制限されたパス(1,2