BOJ 2003数量の和2


https://www.acmicpc.net/problem/2003
時間0.5秒、メモリ128 MB
input :
  • N M(1 ≤ N ≤ 10,000)(1 ≤ M ≤ 300,000,000)
  • A[i] (1 <= A[i] <= 30000)
  • output :
  • 出力
  • 条件:
  • i 1番目の数からj番目の数の和A[i]+A[i+1]+.+A[j-1]+A[j]がMの場合の数
  • これも二重ポインタを利用したり、すべての和を求めたりします.
    import sys
    
    n, m = map(int, sys.stdin.readline().split())
    data = list(map(int, sys.stdin.readline().split()))
    ans = 0
    for i in range(0, len(data)):
        total = 0
        for j in range(i, len(data)):
            total += data[j]
            if total == m:
                ans += 1
                break
            if total > m:
                break
    print(ans)
    
    実際、まず考えられるのはいつも2層for文で繰り返されるので、上のはPypyコミットで正しいです.
    二重ポインタの場合:
    startを0に設定
    endを1にする
    ans=0を指定し、次に.
    値を保存するtempにstartのアイテムを追加します.
    やるべきこと
    temp == m
    ans += 1
    tempから一番前の値startを減算します.
    スタートポイントをstart+=1で移動します.
    temp < m
    temp += arr[end]
    end += 1
    temp > m
    temp -= arr[start]
    start += 1
    そして私が終わるとき.
    この複文はstartend=nは到着したがtempはmより小さく,これはstartを移動しても値が大きくならないためbreakを掛ける必要があることを意味する.