ABC 過去のコンテスト





ABC 208 B – Factorial Yen Coin  解説

def calc(i):
  cnt = 0
  total = 1
  while i>0:
    total *= i
    i -= 1
    cnt += 1
  return total

p = int(input())

count = 0

for i in range(10,0,-1):
  while calc(i) <= p:
    count += 1
    p -= calc(i)

print(count)

ABC 169 A – Multiplication 1

a,b = map(int, input().split())
print(a*b)

ABC 165 A – We Love Golf  breakで繰り返し処理を終わらせる

k = int(input())
a,b = map(int, input().split())

ans = ""

for i in range(a,b+1):
  if i%k==0:
    ans = "OK"
    break
  else:
    ans = "NG"

print(ans)

ABC 158 C – Tax Increase  1<=A<=B<=100 なので、税抜き価格は最大でも1,000

a,b = map(int, input().split())

result = -1

for i in range(1,1001): 
  tax8in = int(i*0.08)
  tax10in = int(i*0.1)
  if tax8in==a and tax10in==b:
    result = i
    break

print(result)

ABC 153 A – Serval vs Monster  while文の基本

h,a = map(int, input().split())
cnt = 0
while h > 0:
  h -= a
  cnt += 1
print(cnt)

ABC 104 B – AcCepted  文字列スライス 文字列検索 文字数カウントs.count() 小文字カウント sum(map(str.islower, s))

s = input()

a = "A" in s[0]
c = "C" in s[2:-1]
d = False
if s.count("C")==1:
  d = True
cnt = False
if len(s) == sum(map(str.islower, s))+2:
  cnt = True
  
lst=[a,c,d,cnt]

if all(lst)==True:
  print("AC")
else:
  print("WA")

ABC 093 B – Small and Large Integers  計算量の重要性 forループ総当たりはムダ

a,b,k = map(int, input().split())

c = (b-a)/2 # a-b範囲内の個数

if c<k: # 個数がkより小さければ、全部出力
  lst = [i for i in range(a,b+1)]
else:
  lst = [i for i in range(a,a+k)] + [i for i in range(b-k+1, b+1)]

for i in lst:
  print(i)

ABC 088 B – Card Game for Two  sorted()の基本

n = int(input())
a = list(map(int,input().split()))

alice = 0
bob = 0

lst = sorted(a, reverse=True)
for i in range(0,len(lst),2):
  alice += lst[i]
for i in range(1,len(lst),2):
  bob += lst[i]

print(alice-bob)

ABC 087 B – Coins  組合せ

a = int(input())
b = int(input())
c = int(input())
x = int(input())

cnt = 0

for i in range(a+1):
  for j in range(b+1):
    for k in range(c+1):
      if i*500 + j*100 + k*50 == x:
        cnt += 1

print(cnt)

ABC 086 A – Product  if文の基本

a,b = map(int, input().split())
if a*b%2 != 0:
  print("Odd")
else:
  print("Even")

ABC 083 B – Some Sums  

# 各桁の総和を求める関数
def sum_digit(x):
  digit=0
  while x>0:
    digit += x%10
    x //= 10
  return digit

n,a,b = map(int, input().split())

total = 0

for i in range(1,n+1):
  if a<= sum_digit(i) <= b:
    total += i

print(total)

ABC 081 B – Shift only  while all() for文の内包表記でリストに改変

n = int(input())
a = list(map(int,input().split()))

cnt = 0
while all(i%2==0 for i in a):
  a = [i//2 for i in a]
  cnt += 1

print(cnt)

ABC 075 B – Minesweeper  複数行入力をリスト化  ””.join(lst)  指定した文字数で分割して2次元リスト化

h,w = map(int, input().split())
s = [list(input()) for _ in range(h)] # 複数行入力を2次元リスト化

lst = []

for i in range(h):
  for j in range(w):
    cnt = 0
    if s[i][j]=="#":
      cnt = "#"
      lst.append(cnt)
    else:
      if i!=0 and j!=0 and s[i-1][j-1]=="#": # 左上
        cnt += 1
      if i!=0 and s[i-1][j]=="#": # 真中上
        cnt += 1
      if i!=0 and j<w-1 and s[i-1][j+1]=="#": # 右上
        cnt += 1
      if 0<j and s[i][j-1]=="#": # 左
        cnt += 1
      if j<w-1 and s[i][j+1]=="#": # 右
        cnt += 1
      if i<h-1 and j!=0 and s[i+1][j-1]=="#": # 左下
        cnt += 1
      if i<h-1 and s[i+1][j]=="#": # 真中下
        cnt += 1
      if i<h-1 and j<w-1 and s[i+1][j+1]=="#": # 右下
        cnt += 1
      lst.append(str(cnt))

lst = "".join(lst)
lst = [lst[i:i+w] for i in range(0,len(lst),w)]  # 指定した文字数で分割して2次元リスト化

for i in range(len(lst)):
  print(lst[i])
# 1行ずつ1次元リスト化 ※行数が判らない場合
import sys
s = []
for e in sys.stdin:
s.append(e.rstrip("\n")
>['…..', '.#.#.', '…..']

# 1文字ずつ分けて2次元リスト化(1) ※行数が判っている場合
s = [list(input()) for _ in range(h)]
>[['.', '.', '.', '.', '.'], ['.', '#', '.', '#', '.'], ['.', '.', '.', '.', '.']]

# 1文字ずつ分けて2次元リスト化(2) ※行数が判っている場合
s = [[e for e in input()] for _ in range(h)]
>[['.', '.', '.', '.', '.'], ['.', '#', '.', '#', '.'], ['.', '.', '.', '.', '.']]





## Welcome to AtCoder
### a+b+c の計算結果と、文字列s を並べて表示

a = int(input())
b,c = map(int, input().split()) ★標準入力を分割して変数に入れる★超よく使う
s = input()
print("{} {}".format(a+b+c, s)) ★formatの各引数(計算結果)を順に{}に入れる★超よく使う



## Product
### a と b の積が偶数か奇数か判定

a,b = map(int, input().split())
if a*b % 2 == 0:
    print("Even")
else:
    print("Odd")



## Placing Marbles
### ビー玉が置かれるマスがいくつあるか求める

s1,s2,s3 = list(map(int, input()))
print(s1+s2+s3)



## Shift only
### 整数がすべて偶数であるとき、整数すべてを2で割ったものに置き換えることができる。ビー玉が置かれるマスがいくつあるか

n = int(input())
a = list(map(int, input().split()))
cnt = 0
while all(i%2==0 for i in a):  ★全ての要素が偶数の場合 all()関数の内包表記
  a = [j/2 for j in a] ★全ての要素を2で割る 内包表記
  cnt+=1
print(cnt)



## Coins
### 500円玉をA枚、100円玉をB枚、50円玉をC枚持っています。何枚かを選び、合計金額をちょうどX円にする方法は何通りあるか。

a = int(input())
b = int(input())
c = int(input())
x = int(input())
count = 0
for i in range(a+1):
    for j in range(b+1):
        for k in range(c+1):
            if i*500 + j*100 + k*50 == x:
                count += 1
print(count)



## Some Sums
### 1以上N以下の整数のうち、10進法での各桁の和がA以上B以下であるものの総和を求めよ
~~~~~~~~~
def calc(n):
  sum_digit=0
  while n>0:
    sum_digit += n%10
    n //= 10
  return sum_digit

n,a,b = map(int, input().split())
total = 0

for i in range(1,n+1):
  if a<=calc(i)<=b:
    total += i

print(total)
~~~~~~~~
n,a,b = map(int, input().split()) ★標準入力を分割して変数に入れる★超よく使う
total = 0
for i in range(1,n+1):
    s = sum(map(int, str(i))) ★各桁の数字を足す
    if a <= s <= b:
        total += i
print(total)
~~~~~~~~~

 x = list("111")
 > ['1', '1', '1']
 > str

 x = list(map(int,"111"))
 > [1, 1, 1]
 > int
~~~~~~~~~
ナベアツ
for i in range(1,41):
  if i%3 == 0 or 3 in list(map(int,str(i))):
    print(i,"(アホ)")
  else:
    print(i)

[8]
[9]
[1, 0]
[1, 1]
~~~~~~~~~


## Card Game for Two
### N枚のカードから、AliceとBobが交互に1枚ずつカードを取っていき、合計がその人の得点になる。
### 2人とも自分の得点を最大化するように最適な戦略を取った時、AliceはBobより何点多く取るか。

n = int(input())
a = sorted(list(map(int, input().split())),reverse=True)
alice = a[0:n:2]
bob = a[1:n:2]
print(sum(alice)-sum(bob))



## Kagami Mochi
### N枚の円形の餅があり、そのうちi枚目の餅の直径はd1,d2...センチメートル。
### これらの餅のうち、一部または全部を使って鏡餅を作るとき、最大で何段重ねの鏡餅を作ることができるでしょうか

import sys
n = int(input()) ----------------
d = []                縦に標準入力された値を
for i in sys.stdin:       1つのリストに収める方法
  d.append(int(i)) --------------
print(len(list(set(d)))) #重複なしリストにして、要素の数をカウント



## Otoshidama
### お年玉袋にはお札がN枚入っていて、合計でY円だったそうですが、嘘かもしれません。
### このような状況がありうるか判定し、ありうる場合はお年玉袋の中身の候補を一つ見つけてください。
### N 枚のお札の合計金額がY円となることがありえない場合は、-1 -1 -1 と出力せよ。
### ありうる場合は、そのようなN枚のお札の組合せの一例を「10000円札x枚、5000円札y枚、1000円札z枚」として
### x、y、zを空白で区切って出力せよ。複数の可能性が考えられるときは、そのうちどれを出力してもよい。

n,y = map(int, input().split())
for i in range(n+1):     #10000円札
  for j in range(n+1-i): #5000円札
    k = n-i-j            #1000円札
    if i*10000 + j*5000 + k*1000 == y:
      print("{} {} {}".format(i,j,k))
      exit()
print("-1 -1 -1")



## 白昼夢
## 英小文字からなる文字列 S が与えられます。 
## Tが空文字列である状態から始め、以下の操作を好きな回数繰り返すことで S=T とすることができるか判定してください。
##   T の末尾に dream dreamer erase eraser のいずれかを追加する。

s = input()
s = s.replace("eraser","")
s = s.replace("erase","")
s = s.replace("dreamer","")
s = s.replace("dream","")
if s=="":
  print("YES")
else:
  print("NO")

発想の転換(文字の重なりを考慮して順番に消していって空白になれば判定Trueということ)
※itertools.permutations()は、結果がタプル型で返ってきてしまうので''.join()が使えないし、
 itertools.chainl.from_iterable()にも勧めない)



## Traveling
## シカのAtCoDeerくんは二次元平面上で旅行をしようとしています。 AtCoDeerくんの旅行プランでは、
## 時刻0 に 点(0,0) を出発し、1以上 N以下 の各i に対し、時刻ti に 点(xi ,yi) を訪れる予定です。
## AtCoDeerくんが時刻 t に 点 (x,y) にいる時、時刻 t+1 には 点 (x+1,y), (x−1,y), (x,y+1), (x,y−1) のうちいずれかに存在することができます。
## その場にとどまることは出来ないことに注意してください。 AtCoDeerくんの旅行プランが実行可能かどうか判定してください。