LoginSignup
0
1

More than 3 years have passed since last update.

AtCoder日記(チュートリアル)

Last updated at Posted at 2019-06-06

初めに

とりあえずPythonやるためにクリアしたコードを書いていく予定である。

ABC086A - Product

積の奇遇を判定。
ビット表現で考えると掛け算は不要で、&して最下位ビットだけ見れば求められる。
Pythonの標準入出力に慣れておらず、そこが一番厄介だった。

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

c = "Even" if (a&b&1)==0 else "Odd"

print(c)

ABC081A - Placing Marbles

ビットカウント。
3ビットしかないので2進で読んでビットを数えればいい。
条件分岐なしで出来る。

atcoder.py
a = int(input(),2)

c = (a&1) + ((a>>1)&1) + ((a>>2)&1)

print(c)

ABC081B - Shift only

総論理和を取ってシフト回数を数える。
リストすべての論理和をmap()か何かできれいにやる方法を思いつかなかった。
右シフト回数カウントは、ビット演算だけで出来るが、総論理和にループがあるので不採用とした。

atcoder.py
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の総当たり検索。オーダーが小さいのでアルゴリズムはない。
アルゴリズムだと逆に難しい。

atcoder.py
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では//=は使うべきでない。

atcoder.py
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が不要であった。

atcoder.py
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

重複排除するだけである。

atcoder.py
n = int(input())
d = []

for a in range(n):
    d.append(int(input()))

result = len(set(d))

print(result)

ABC085C - Otoshidama

力技で当てはまるものを検索。

atcoder.py
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した。手動で反転なんてするものじゃなかった。

atcoder.py
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の倍数でなければならない。

atcoder.py
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)
0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1