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)
『反省点』
『学んだこと』
-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)
Reference
この問題について(Pythonアルゴリズム015|数に**をプラスして必ず復習します), 我々は、より多くの情報をここで見つけました https://velog.io/@myway00/파이썬-알고리즘-015-수들의-합テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol