inoyu0121
@inoyu0121

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

プログラミング初心者です。競プロで行き詰りました。

解決したいこと

ifをつかってwin lose drawのいづれかを出力したいです。
https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_ce

発生している問題・エラー

ifをつかって分岐させているつもりですが、すべてlooseとでてしまいます。

該当するソースコード

N = int(input())
A = list(map(int, input().split()))
Q = int(input())

L = [None]*Q
R = [None]*Q
S = [None]*(N+1)
S[0] = 0
for i in range(N):
    S[i+1] = S[i]+A[i]


for i in range(Q):
    L[i], R[i] = map(int, input().split())


for i in range(Q):
    if S[R[i]]-S[L[i]] > R[i]-L[i]:
        print("win")
    elif S[R[i]]-S[L[i]] < R[i]-L[i]:
        print("lose")
    elif S[R[i]]-S[L[i]] == R[i]-L[i]:
        print("draw")

0

4Answer

7
1 1 1 1 1 1 1 
1
1 7

の時に、drawになりました。
ですので、「すべてloose」というご認識は間違っているようです。

1Like

Comments

  1. @inoyu0121

    Questioner

    コメントありがとうございます!

競プロで行き詰りました。

どこの問題でしょうか?引用元を示されるべきかと思います。

1Like

Comments

  1. @inoyu0121

    Questioner

    コメントありがとうございます!初めての投稿だったため、次回気を付けます!

  2. 初めての投稿だったため、次回気を付けます!

    次回ではなく今から修正(情報の追記)すれば良いかと思います。
    Qiitaの利用規約違反や先方の利用規約違反にもなりえます。先方が転載OKにしているなら良いですが・・・

@inoyu0121さん
原因を探すために、コードを読みましたが、
どういう解き方をされているのか分からなかったので、教えていただきたいです。

以下の部分が特に分かりませんでした。

L = [None]*Q
R = [None]*Q
S = [None]*(N+1)
S[0] = 0

for i in range(N):
    S[i+1] = S[i]+A[i]

for i in range(Q):
    L[i], R[i] = map(int, input().split())
  • LとRがlistの理由と中身
    • 問題文を見る限り、LとRは、回数に関する情報ですが、それを質問数の要素数を持ったlistにしている理由が分かりませんでした。
  • 変数Sの役割
    • 入力例1で動かしてみました。そのときのSの中身が以下の通りでした。このSの結果を見ても、何の情報か私にはちょっとわかりませんでした。

[0, 0, 1, 2, 2, 3, 3, 3]

1Like

Comments

  1. @inoyu0121

    Questioner

    コメントありがとうございます。
    LとRがlistの理由と中身については、競プロの問題をリストにしていたため、とりあえず似たような形にしてみました。
    Sは当たりが出ると+1されるという累積和のつもりでかいてました。

とりあえず、問題のURLはきちんと載せましょう。

まず、こちらの問題は累積和の知識を前提としていますので、書籍の解説を読むなり、Web上の解説を読むなりして理解してください。たとえば、このあたりなどいかがでしょうか。

ご提示のコードには、3点の間違いがあると思われます。

  • S[R[i]]-S[L[i]]という計算式で、何を計算しようとしているのでしょうか。$L_i$から$R_i$までのアタリの数だと思っているのであれば間違いです。
  • R[i]-L[i]という計算式で、何を計算しようとしているのでしょうか。$L_i$から$R_i$までのくじを引いた総数だと思っているのであれば間違いです。
  • S[R[i]]-S[L[i]] > R[i]-L[i]という比較で、何を判定しようとしているのでしょうか。$L_i$から$R_i$までのアタリの数のほうが、$L_i$から$R_i$までのハズレの数より大きいか判定していると思っているのであれば間違いです。

コードテストあたりで、末尾にこのようなコードをつけたうえで実行して、何が表示されるか試してみてください。

for i in range(Q):
    print()
    print(f'L[{i}], R[{i}]: ({L[i]}, {R[i]})')
    print(f'S[R[{i}]]-S[L[{i}]]: {S[R[i]]-S[L[i]]}')
    print(f'R[{i}]-L[{i}]: {R[i] - L[i]}')
    print(f'S[R[{i}]]-S[L[{i}]] > R[{i}]-L[{i}]: {S[R[i]]-S[L[i]] > R[i]-L[i]}')

あとは、書籍を持っているのであれば、問題 A06の回答例のソースと自分のソースを比較してください。明らかに違うところが見つかるはずです。

どうしても分からないようであれば、こちらに正しく動くように修正したコードを載せておきますので、参照してください。

1Like

Comments

  1. @inoyu0121

    Questioner

    プログラミング初心者のためにご丁寧に本当にありがとうございます。
    コメントの3つの間違いについて、ご指摘の通りそのように考えていました。
    記載いただいたコードを実行してみたいとおもいます。ありがとうございました。

Your answer might help someone💌