Pythonメモ1-1

ただのメモです・・・・・・。ご了承ください・・・。

 

atcoder.jp

 

 

 

ABC081B - Shift only

・N個の整数が与えられ、与えられたN個の整数が2で何回割り切れるかを数える問題。

・予め、割り切れる数を x とする。(例えば、4 8 なら x=2 を出力)

・N個の整数をリスト型にし、以下の条件を考える。

 

▼リストについて

  1. List = list(map(int, input().split()))

 

 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

条件:リスト中の全要素が2で割り切れるならば

  1.リストの全要素を2で割った値を新しいリストにする

  2.x に1を足す

  (3.条件に戻る。満たさなければ print(x) で出力する)

 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

▼まず、条件を立式する。条件が成立する間だけ操作を繰り返してくれればよいので、while関数を用いる。(forは指定回数なので本問題においては不適切。故にwhileを用いる。)

立式の仕方:while 条件式: のように書く。(ex. while a < 2:)(for文は、for i in range(): と書く。range() を忘れない)

  1. while all(i%2==0 for i in List):

 リストの全要素が要素分だけ2で割り切ることを考えればよい。

 

▼1について、リスト内の要素全てを2で割って再定義するので List = [List +α] の形にするのが見える

  1. List = [i/2 for i in List]

 

▼2について、x に1を足すだけなので

  1. x +=1

 

以上をまとめて書くと以下のようなプログラムが書ける。

 

  1. N = int(input())
  2. List = list(map(int, input().split()))
  3. x = 0
  4. while all(i % 2 == 0 for i in List):
  5.   List = [i / 2 for i in List]
  6.     x += 1
  7. print(x)

 

感想:Too difficult for beginners.

リストには苦手意識があるので良い練習になる。(普通に書き方すら分からん・・・)

while文とリストの融合がんにゃぴ・・・よくわからなかったです(特に先頭のallとか。理解は曖昧だが・・・)

 

結論:ムズスギィ!

 

 

 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

 

ABC087B - Coins

ガチ初心者にはtoo diffだったので、他の方の提出結果を参考にさせて頂きました。

ま  さ  か  の  全  探  索

少なくとも 50³=125000 通りだから全探索で余裕っしょ!wスタイルには流石に笑う

 

例として、500円玉、100円玉、50円玉がそれぞれ4枚ずつあり、合計2000円にしたい場合を考える。

この手の数学の問題は値が大きいものから攻めていくのが基本である。

したがって、500円玉を何枚使うかから考えると、0,1,2,3,4枚使う 4+1 通りがある。

1,2,3,4枚使う+使わない通り数があるため、1 を加える。

すなわち、一般化した A 枚のとき、A+1 通りだけあるのだ。

 

A+1だけの指定回数だけ操作を実行すればよいので、for文が役立つのがわかる。

 

・参考通り、for文の3重ループで実装していくことにする。

・予め、標準入力の数字を A,B,C,x で受け取る。

 

  1. A = int(input())
  2. B = int(input())
  3. C = int(input())
  4. x = int(input())

 

・何通りあるのかを定義するため、count で書くことにする。

for文で条件を満たすものがあれば count += 1 と書けばよいだろう。

 

  1. count = 0

 

・ここでは、500円玉は A 枚、100円玉は B 枚、50円玉は C 枚ある。for文で条件を以下のように作りたい。

 

 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

条件:500円玉が a=0,1,2,...A 枚のとき、その各々に対し100円玉が b=0,1,2,...B 枚の各々に対し50円玉が c=0,1,2...C枚が 500a+100b+50c=x を満たすならば、count +1=0

 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 

・条件を満たすためのfor文が3つ必要なのも見えてくる。

・A+1回、B+1回、C+1回だけ操作してくれればよいので、以下のように書ける。

 

  1. for a in range(A+1):
  2. for b in range(B+1):
  3. for c in range(C+1):

 

・これが 500a+100b+50c=x を満たすならば、count +1=0 と書けばよいので

 

  1. if 500*a + 100*b + 50*c == x:
  2.   count += 1

 

・あとは print(count) で出力すればよい。

・以上をまとめると、以下のようなプログラムが書ける。

 

  1. A = int(input())
  2. B = int(input())
  3. C = int(input())
  4. x = int(input())
  5.  
  6. count = 0
  7.  
  8. for a in range(A+1):
  9.   for b in range(B+1):
  10.     for c in range(C+1):
  11.       if 500*a+100*b+50*c == x:
  12.         count += 1
  13. print(count)

 

感想:toooooooo difficult

まさかのfor文三重ループくんは思いつきませんでした・・・

本問を3ループでなく2ループだったり、1ループで解く人もいますが、超初心者なので定番っぽいものだけ解いて満足してます・・・余力もないし

また知識や経験が増えてくれば別解も考慮したいぐらい。

 

結論:うんち!w