質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1494閲覧

このコードはどこがおかしいですか?Atcoder

9nahito

総合スコア45

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/03 10:51

編集2021/06/09 10:52

Atcoder の ShiftOnly という問題についてです。
下のコードをPythonで書いて提出したのですが正解になりません。

コードをかなり改善してsampleは全部正解になったのですがまだ不正解の部分が残ってしまいます..
イメージ説明

python

1#すべての整数を割ってから処理した回数カウントを増やしていく方法は 2#自分では出来なかったのでそれぞれの整数を何回割れるかカウント(c1)して 3#それらのカウントの最小値を求めることで答えを出す 4 5n = int(input()) 6a = list(map(int,input().split())) 7 8c1 = 0#処理の回数 9c2 = 0#最初に偶数がいくつあるか 10a2 = 0#偶奇を判断するための変数 11ans = 999999#俺の好きな9 12 13for a3 in a:#a3に一つずつaの要素が代入される 14 a2 = a3 % 2 15 if a2 == 0: 16 c2 += 1 17 18if c2 == n:#最初の数がすべて偶数だったら 19 for a2 in a: 20 while a2%2 == 0:#偶奇 21 a2 /= 2#÷2 22 if a2%2 == 0:#割って偶数だったら 23 c1 += 1#処理回数のカウントを増やす 24 ans = min(ans,c1)#c1の最小値を出す 25else: 26 ans = 0#最初の整数がすべて偶数じゃなかったら 27 28print(ans)

問題のURL
https://atcoder.jp/contests/abs/tasks/abc081_b

どこが間違ってるかどうしても分かりません。
回答よろしくお願いします<m(__)m>

解決後追記--
使わせてもらった yosukesan さんのコードに自分用とこれからこれを見る人がいるかもなので
解説を増やしました。
yosukesan さんの コード

Python

1#すべての整数を割ってから処理した回数カウントを増やしていく方法は 2#自分では出来なかったのでそれぞれの整数を何回割れるかカウント(c1)して 3#それらのカウントの最小値を求めることで答えを出す 4#teratail で修正してもらいました 5 6n = int(input()) 7a = list(map(int,input().split())) 8 9c1 = 0#処理の回数 10c2 = 0#最初に偶数がいくつあるか 11a2 = 0#偶奇を判断するための変数 12ans = 0#俺の好きな9 13 14for a3 in a:#a3に一つずつaの要素が代入される 15 a2 = a3 % 2 16 if a2 == 0: 17 c2 += 1#tが入っていた 18 19stop = True 20if c2 == n:#最初の数がすべて偶数だったら 21 while stop == True:#== Trueは省略可能 22 for i in range(0, len(a)): 23 if a[i]%2 == 0:#偶奇 24 a[i] /= 2#÷2 25 else:#奇数 26 stop = False 27 ans += 1 #全ての要素が偶数なのを確認したので、カウント+1 28 29else: 30 ans = 0#最初の整数がすべて偶数じゃなかったら 31 32print(max(ans-1,0))#26行 stop = False になってもその下に ans += 1があるので 33#奇数が出ても一度 ans += 1 されるので 出力するときに -1 34 35#max() で 最大値を出してるのは 奇数だったら ans = 0 なので 出力結果が -1 になってしまうのを防ぐため

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

普段は C++ で参加しています。

配列の要素全てが偶数だったら、回数をカウントするようになっていないからでは?
配列の途中でも要素が偶数だったら、回数をカウントしています。

とりあえず以下で AC しましたが、 まだ変数の二重定義などまだあるかもしれません。
AtCoder は終了したコンテストならば、他の人の回答も見られるので、強い人の例を参考にするのをお勧めします。

#すべての整数を割ってから処理した回数カウントを増やしていく方法は #自分では出来なかったのでそれぞれの整数を何回割れるかカウント(c1)して #それらのカウントの最小値を求めることで答えを出す n = int(input()) a = list(map(int,input().split())) c1 = 0#処理の回数 c2 = 0#最初に偶数がいくつあるか a2 = 0#偶奇を判断するための変数 ans = 0#俺の好きな9 for a3 in a:#a3に一つずつaの要素が代入される a2 = a3 % 2 if a2 == 0: c2 += 1t stop = True if c2 == n:#最初の数がすべて偶数だったら while stop: for i in range(0, len(a)): if a[i]%2 == 0:#偶奇 a[i] /= 2#÷2 else: stop = False ans += 1 #全ての要素が偶数なのを確認したので、カウント+1 else: ans = 0#最初の整数がすべて偶数じゃなかったら print(max(ans-1,0))

ちなみに、これぐらいまで削ぎ落とせます。こちらも AC しました。

n = int(input()) a = list(map(int,input().split())) ans = 0#俺の好きな9 stop = True while stop: for i in range(0, len(a)): if a[i]%2 == 0:#偶奇 a[i] /= 2#÷2 else: stop = False ans += 1 print(ans-1)

なお、私ならば以下の様に書きます。AC しています。

n = int(input()) a = list(map(int,input().split())) ans = 0 while True: # 配列の中の要素が 1 つでも奇数になるまで無限ループ # 配列の要素の中から、偶数の要素だけ取りだす a = list(filter(lambda x: x%2==0, a )) # 偶数の数が初期配列の長さ n でないならば、終了 if len(a) != n: break # 全ての配列要素が、偶数なので 2 で割り、終了条件を満さないので次のステップへ a = list(map(lambda x: x/2, a )) ans+=1 print(ans)

投稿2021/06/06 03:25

編集2021/06/06 03:35
yosukesan

総合スコア41

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

9nahito

2021/06/09 10:42

回答ありがとうございます! yosukesan さん が一番上で教えてくださったコードで無事 AC しました! 本当にありがとうございます!
guest

0

操作のルールは

書かれている整数が“すべて”偶数

書かれている整数“すべて”を,2 で割ったものに置き換える

なので、書かれている整数“すべて”を置き換えた時点で、操作した回数が1回増える

投稿2021/06/03 15:53

modieu

総合スコア282

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

9nahito

2021/06/05 12:04

回答ありがとうございます! modieuさんの説明も参考にしてコードを書き直してみました! でも私の何らかのミス?でまだsample以外で不正解が2つ残っています.. どこが間違ったコードなのか教えてくださると助かります!
modieu

2021/06/06 17:31 編集

ans = min(ans,c1) した後、c1 をリセットするのを忘れています。 それと、ACするかどうかとは関係ないのですが、 a2%2 == 0 が重複しています。 while a2%2 == 0: (インデント)a2 /= 2#÷2 (インデント)c1 += 1 でできると思います。
9nahito

2021/06/09 10:46

返信ありがとうございます! 返信めちゃくちゃ遅くなってしましました。 ごめんなさい、、 ここまで教えてもらって申し訳ないのですが今回は 先に yosukesan さんのコードで AC したので 今回はyosukesan さんをベストアンサーにさせてもらいます。 最後までありがとうございました<m(__)m>
guest

0

c0 += 1

を実行する回数が多すぎるからです。

投稿2021/06/03 11:11

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

9nahito

2021/06/05 12:02

回答ありがとうございます! コードをかなり変えてみてsampleでは正解できたのですがそれ以外のところで二つ不正解が残ってしまいました..どこがおかしいのかまた教えてくださると助かります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問