Pythonアルゴリズム015|数に**をプラスして必ず復習します


15.木の和


N個の数列A[1],A[2],...,A[N]がある.この数列のiからjまで
合計A[i]+A[i+1]+...+A[j-1]+A[j]がMの場合、整数を求めるプログラムを作成します.
■説明の入力
第1行はN(1≦N≦10000),M(1≦M≦3000000)を与える.次の行はA[1],A[2],...,
A[N]はスペースで区切られている.各A[x]は30000を超えない自然数である.
■出力説明
1行目の出力状況の数.
■入力例1
8 3
1 2 1 3 1 1 1 2
■出力例1
5

『私の答え』


解けなかった...

<解答>


コメント:
まず、和がm未満の場合は、マージの範囲を増やす必要があります.
rtを加えた2番目の値(rtの初期値はltより1つ大きい)
rtは右に1つ移動します.
rundertは無限大にできないため,数列の個数より大きいと中断する.
また、前述したように、一定範囲以上の和を要求する必要はなく、ltからrtまでの和がmより大きい場合、gtからgt位置の値を減算し、gtを1つのスペースの右側に移動する.
また,ltとrtの値が同じ(=重なる場合)では,最終的にはその位置の数字を加算し,その和に基づいて次の動作を決定するだけである.
ltは和が大きくなると右に移動するのでrtほど大きくない.

<解答>

n, m = map(int,input().split())
a=list(map(int,input().split()))
cnt=0
lt=0
rt=1
tot=a[0] #range(lt,rt)의 부분합

while True:
    if tot<m:
        if rt<n:
            tot+=a[rt]
            rt+=1 
        else:
            break
    elif tot==m:
        cnt+=1
        tot-=a[lt]
        lt+=1
    else:
        tot-=a[lt]
        lt+=1
print(cnt)

『反省点』

  • は一つも解けなかった.ぜひもう一度解いてみてください
  • .

    『学んだこと』

  • Python繰り返し文脱出
  • (1) break
    -whileの無限ループに数値を追加し、変数iが一定値に達すると、繰り返し文を終了できます.
    i = 0
    while True:    # 무한 루프
        print(i)
        i += 1          # i를 1씩 증가시킴
        if i == 100:    # i가 100일 때
            break       # 반복문을 끝냄. while의 제어흐름을 벗어남
    -forの無限ループでも繰り返し文を終了できます
    for i in range(1000):
    	print(i)
        if i==100
        	break
    (2) continue
    -whileのコード実行をスキップ
    i = 0
    while i < 100:        # i가 100보다 작을 때 반복. 0부터 99까지 증가하면서 100번 반복
        i += 1            # i를 1씩 증가시킴
        if i % 2 == 0:    # i를 2로 나누었을 때 나머지가 0이면 짝수
            continue      # 아래 코드를 실행하지 않고 건너뜀
        print(i)
    -for上のコード実行をスキップ
    for i in range(100):       # 0부터 99까지 증가하면서 100번 반복
        if i % 2 == 0:         # i를 2로 나누었을 때 나머지가 0면 짝수
            continue           # 아래 코드를 실행하지 않고 건너뜀
        print(i)

    <第2話毒ガス放出>

    n, m = map(int, input().split())
    a=list(map(int, input().split()))
    cnt=0
    sum=0
    
    for i in range(n):
        sum=a[i]
        if sum==m:
            cnt+=1
            continue
        for j in range(i+1,n) :
            sum+=a[j]
            if sum==m:
                cnt+=1
                break
    print(cnt)
  • 問題を解く過程は覚えていないで、双for文で問題を解く