初めに
とりあえずPythonやるためにクリアしたコードを書いていく予定である。
ABC086A - Product
積の奇遇を判定。
ビット表現で考えると掛け算は不要で、&して最下位ビットだけ見れば求められる。
Pythonの標準入出力に慣れておらず、そこが一番厄介だった。
a, b = map(int, input().split())
c = "Even" if (a&b&1)==0 else "Odd"
print(c)
ABC081A - Placing Marbles
ビットカウント。
3ビットしかないので2進で読んでビットを数えればいい。
条件分岐なしで出来る。
a = int(input(),2)
c = (a&1) + ((a>>1)&1) + ((a>>2)&1)
print(c)
ABC081B - Shift only
総論理和を取ってシフト回数を数える。
リストすべての論理和をmap()か何かできれいにやる方法を思いつかなかった。
右シフト回数カウントは、ビット演算だけで出来るが、総論理和にループがあるので不採用とした。
n = int(input())
a = list(map(int,input().split()))
bit = a[0]
for b in a[1:]:
bit = bit | b
result = 0
while (bit!=0) and ((bit&1)==0):
result+=1
bit = bit>>1
print(result)
ABC087B - Coins
50^3の総当たり検索。オーダーが小さいのでアルゴリズムはない。
アルゴリズムだと逆に難しい。
a = int(input())
b = int(input())
c = int(input())
x = int(input())
result = 0
for d in range(a+1):
for e in range(b+1):
for f in range(c+1):
if (d*500+e*100+f*50) == x:
result += 1
print(result)
ABC083B - Some Sums
総当たりで条件にあてはまるものを加算するだけ。
Pythonの判定処理に問題があるのか//=演算子を入れると強制NGで随分悩んだ。
AtCoderのコードテストだと動作するのに、提出するとサンプル含めてNGだから鯖側に何らかの問題があると思う。
//がコメントになってるとか?
AtCoderのPythonでは//=は使うべきでない。
n,a,b = map(int, input().split())
result = 0
for c in range(1, n+1):
s = 0
d = c
while d>0:
s += d%10
#d //= 10 何故かアップロードすると全部NGになる
d = d//10
if (s>=a) and (s<=b):
result +=c
print(result)
ABC088B - Card Game for Two
ソートして奇数番目のsumと偶数番目のsumを取ればよい。
スライスのやり方の勉強。
ただ、pythonだとNが不要であった。
n = int(input())
a = list(map(int, input().split()))
a.sort(reverse=True)
result = sum(a[::2])-sum(a[1::2])
print(result)
ABC085B - Kagami Mochi
重複排除するだけである。
n = int(input())
d = []
for a in range(n):
d.append(int(input()))
result = len(set(d))
print(result)
ABC085C - Otoshidama
力技で当てはまるものを検索。
N,Y = map(int,input().split())
x = -1
y = -1
z = -1
for i in range(N+1):
for j in range(N+1-i):
if(10000*i+5000*j+1000*(N-i-j))==Y:
x,y,z = i,j,N-i-j
break
print('{0} {1} {2}'.format(x,y,z))
ABC049C - 白昼夢 / Daydream
逆順スライスで添え字がどうなるかだけが問題だった。
逆順は-1から始まっているから符号反転してマイナス1すればいいらしい。
うっかりdreamerの反転を誤植して、WAした。手動で反転なんてするものじゃなかった。
S = input()
w = ['maerd','remaerd','esare','resare']
result = 'YES'
length = -len(S)
index=0
while index>length:
found = False
for s in w:
l = len(s)
if s==S[index-1:index-l-1:-1]:
found = True
index -= l
if found == False:
result = 'NO'
break
print(result)
ABC086C - Traveling
移動量と移動時間を求めて、余分な時間が2の倍数か調べればよい。
2回移動すれば元の位置に戻れるので余裕時間は2の倍数でなければならない。
def canMove(src,dest):
st,sx,sy = src
dt,dx,dy = dest
distance = (abs(dx-sx)+abs(dy-sy))
tdiff = dt-st
if tdiff >= distance and ((distance-tdiff)&1) == 0:
return True
else:
return False
N = int(input())
txy = []
result = 'Yes'
pos = (0,0,0)
for i in range(N):
txy.append( tuple(map(int,input().split())) )
for j in txy:
if canMove(pos,j):
pos = j
else:
result = 'No'
break
print(result)