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

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

ただいまの
回答率

88.59%

AtCoder Beginner Contest 010 B花占いについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 365

negoto

score 13

 問題文

高橋君の秘書のなぎさちゃんは、高橋君が大好きです。つまり、高橋君もなぎさちゃんの事が大好きであるに違いありません。 そのことを確認するために、庭に咲いている花で、花占いをすることにしました。

「好き」、「嫌い」、「好き」、「嫌い」、「好き」、「嫌い」……。

おかしいです。高橋君はなぎさちゃんの事が好きであるはずなのに、花占いの結果は「嫌い」でした。 これは、花が悪いに違いありません。

なぎさちゃんは、使用人達に、花占いの結果が「嫌い」にならないように、花びらを毟るよう命じました。

なぎさちゃんの花占いは、2つのパターンがあります。 一つは、「好き」「嫌い」を交互に言いながら、花びらを 1 枚ずつ毟っていくパターンです。 もう一つは、「好き」「嫌い」「大好き」の 3 つを繰り返しながら、花びらを1枚ずつ毟っていくパターンです。

どちらのパターンにおいても、最後に言った言葉が、花占いの結果となります。

なぎさちゃんの使用人であるあなたは、なぎさちゃんがどちらのパターンで花占いをしたときも、「嫌い」にならないように、 花びらを事前に毟ってあげる必要があります。

庭に咲いている花の数と、その花びらの枚数が与えられるので、花びらを毟る必要のある枚数を出力してください。

入力
入力は以下の形式で標準入力から与えられる。

n
a1 a2 ... an
1 行目には、庭に咲いている花の数を表す整数 n(1≦n≦10) が与えられる。
2 行目では、それぞれの花の花びらの枚数に関する情報が、スペース区切りで与えられる。 i 番目の花の花びらの枚数は、 i 番目に与えられる整数 ai(1≦ai≦9)によって与えられる。
出力
毟る必要のある花びらの枚数を 1 行で出力せよ。出力の末尾には改行をいれること。

入力例1
Copy
3
5 8 2
3
5 8 2
出力例1
Copy
4
4
最初の花に注目します。

花びらの数が 5 枚の時、2 つ目のパターンの花占いで、「好き」「嫌い」「大好き」「好き」「嫌い」となり、「嫌い」になってしまうので、花びらを毟らなければなりません。
花びらの数が 4 枚の時、1 つ目のパターンの花占いで、「好き」「嫌い」「好き」「嫌い」となり、「嫌い」になってしまうので、花びらを毟らなければなりません。
花びらの数が 3 枚の時、1 つ目のパターンで「好き」、2 つ目のパターンで「大好き」となるため、花びらを毟る必要がありません。
同様に、花びら 8 枚の花は 7 枚に、花びら 2 枚の花は 1 枚にすることにより、「嫌い」になることを防ぐことが出来ます。

花びらを毟る必要のある枚数の合計は、2+1+1=4 枚となります。

 質問文 この問題をpythonで解けずに困っています。

方針1は、一つ目のパターンなら、余りが出ないとき1枚毟る。二つ目のパターンなら余りが2のとき1枚毟るを利用して。以下のコードを考えました。
n = int(input())
x = [int(input()) for i in range(n)]
if x[i] % 2 == 2:
x[i] = x[i] - 1
if x[i] % 2 == 0:
x[i] = x[i] - 1

ここまで考えましたが、これだと毟った数をどのように足せばいいのかわからないので別の方針を試そうと思い、解説を読んだところ、方針2で
「それぞれの枚数について、毟る枚数をあらかじめ書いておく。
{0, 0, 1, 0, 1, 2, 3, 0, 1, 0}を用いる。」とありましたが、{0, 0, 1, 0, 1, 2, 3, 0, 1, 0}がどの枚数を表しているかわかりません。

長々と書きましたが、アルゴリズム的に簡単なのは方針2だと思います。そのため、こちらで解きたいので{0, 0, 1, 0, 1, 2, 3, 0, 1, 0}がどの枚数を表しているか教えてください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2018/10/30 12:57

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

checkベストアンサー

+1

方針2においては、以下の表を見てよく考えると理解できるかと思います。

花弁枚数 1 2 3 4 5 6 7 8 9
好/嫌 × × × ×
好/嫌/大好 × × ×
毟る枚数 0 1 0 1 2 3 0 1 0

ただし、題意ではありえない花弁0枚をリスト操作の都合上、先頭に0を入れていると思われます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/30 13:46

    とてもわかりやすい解説ありがとうございます!
    問題見直してみたら花弁は最大で10枚だからこのようなものを用いたんですね。

    キャンセル

+1

{0, 0, 1, 0, 1, 2, 3, 0, 1, 0}がどの枚数を表しているか

各花の花びらの枚数の入力での制約は、1-9ですが、値から見る限り、0から9の10個を表現しているように思います。


# coding: utf-8
def conv(x):
    leafToRemove = {"1":0, "2":1, "3":0, "4":1, "5":2, "6":3, "7":0, "8":1, "9":0}
    return leafToRemove[x]

input()
print(sum([conv(x) for x in input().split(" ")]))

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/30 13:47

    回答ありがとうございます!
    コードまで示していただき大変わかりやすかったです。

    キャンセル

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る