初心者が過去問精選 10問やっていく②


この記事の過去問を初心者が解いていきます。続きです

問4 ABC 087 B - Coins (200 点)

x = int(input())
y = int(input())
z = int(input())
total=int(input())
count =0
for i in range(x+1):#500円が〇枚あるときの探索(x枚までで)
  for j in range(y+1):#100円が〇枚あるとき(y枚までで)
    for k in range(z + 1):#50円が〇枚あるとき(z枚までの間で)
      if total == i * 500 + j * 100 + k * 50:#totalが合計と同じになればcount+1する
        count = count +1
print(count)

はじめ見たときは全く別の解き方で解こうとしていましたが効率の良い解き方はないかなと思って全探索の考え方を検索してときました。
最初何しているのかわからなかったですが一つ一つ何をしているのかをほどいていくと意外に単純なことしてるのだと気づきました。

第 5 問: ABC 083 B - Some Sums (200 点)

N,x,y = map(int,input().split())
lst=[]
def GG(n):#数値nの各桁の合計を得る関数
  sum2 = 0
  while n > 0:
    sum2 += n % 10
    n //= 10
  return sum2


for i in range(N+1):#N+1にしないと0から始まってるのでー1の状態で終わる
  if x <= GG(i) <= y:
    lst.append(i)
print(sum(lst))

#ここから下は最初にやろうとして失敗したコード    
while i < N+1:
  sun = 0
  s = i % 10
  n =int( i / 10 )
  sun = sun + s
  if s == 0:
    sun = sun+ n
  print(sun)
  print(type(sun))
  if x <= sun <= y:
    lst.append(i)
  i += 1
print(sum(lst))

結構苦戦しました。さいしょにやろうとしたコードだと桁の合計を求めようとしてぐちゃぐちゃになったり一回しかiを10で割れてなかったりして失敗しました。
なら関数作ったりしたらいいというヒントをもとに関数作ってそれをFORの中で実行という形にしました。

第六問 ABC 088 B - Card Game for Two (200 点)


n = int(input())
ss = list(map(int,input().split()))
#print(n,ss)
ss.sort(reverse=True)#降順にソート
odd = 0 #奇数
even = 0 #偶数
#print(ss)#listの確認
for i in range(n):
  if i % 2 ==0:#0,2,4,6,8~の時
    even = even + ss[i]
  elif i % 2 == 1:#13579~の時
    odd = odd + ss[i]
print(even-odd)

ソートの問題・・ということなのでソートを使った解き方をしています。
大きいほうから交互にとるという条件なので奇数偶数で行ける層と思いやってみたらいけました。
問5のような系統の問題のほうが苦手意識がありました。
今週はこのくらいで練習問題をいくつか挙げてくれているのでそれをやりつつ、土日で一気に残りの4問やっていこうと思います!

ZONE4問目

t = []
x = input()
a = list(x)
count= 0
print(a)
nagasa = len(x)
for i in range(nagasa):  
  if a[i] == "R":
    t =t[::-1]
    count = count + 1
    print(count)
  else:
    gg  = a[i]
    t.append(gg)

print(t)
print(type(t))
for aa in range(nagasa):
  if t[aa] == t[aa-1]:
    del t[aa]
    del t[aa-1]
print(t)

ここは競技プログラミングのメモ(解けなかった)なので無関係なやつです