読者です 読者をやめる 読者になる 読者になる

唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

AtCoder Regular Contest 040 ◯◯◯- 1183->

49位 300点

Splatoonネタの問題回
C問題までは比較的簡単に解けたが、D問題が難しくて部分点も取れず

公式の解説

www.slideshare.net

A: 床塗り - AtCoder Regular Contest 040 | AtCoder

最大100x100の盤面が与えられるので'R'と'B'どっちが多いかによって、勝ったプレイヤーの名前を答える

数えて比較するだけ

# -*- coding: utf-8 -*-
import math,string,itertools,fractions,heapq,collections,re,array,bisect,sys

def s():
    return raw_input().strip()
def n():
    return int(raw_input())

a = n()
r = 0
b = 0
for i in xrange(a):
    for c in s():
        if c == 'R':
            r += 1
        elif c == 'B':
            b += 1

if r > b:
    print 'TAKAHASHI'
elif r < b:
    print 'AOKI'
else:
    print 'DRAW'

B: 直線塗り - AtCoder Regular Contest 040 | AtCoder

マスが直線上に並んでいる
あるマスが塗られているかどうかの情報が与えられる
左端のマスから出発して右に移動しながらマスを塗っていく
現在のマスを含んで右に\(R\)個のマスを一度に塗ることができる時の移動回数と塗った回数の和の最小値を求める

最後に塗る必要がある場所までの移動距離と最低限必要な塗る回数の和を求めればよい

# -*- coding: utf-8 -*-
import math,string,itertools,fractions,heapq,collections,re,array,bisect

def s():
    return raw_input().strip()
def ln():
    return map(int, raw_input().strip().split())

N, R = ln()

S = list(s())
L = len(S)
idx = 0
count = 0
for i in xrange(L - 1, -1, -1):
    if S[i] == '.':
        count += 1
        if idx < i - R + 1:
            idx = i - R + 1
        for j in xrange(i, i - R, -1):
            S[j] = 'o'

print count + idx

C: Z塗り - AtCoder Regular Contest 040 | AtCoder

縦横\(N\)マスの盤面とそれぞれのマスが塗られているかどうかの情報が与えられる(\(1 \le N \le 100\))
ある位置を指定すると指定した位置のマスとそれより左側のマス、指定した位置より一つ下のマスとそれより右側のマスが塗られる
すべてのマスを塗るのに必要な最小回数を答える

上の行から順に塗り残しがないように貪欲に塗っていけばよい

# -*- coding: utf-8 -*-
import math,string,itertools,fractions,heapq,collections,re,array,bisect

def fs():
    return [raw_input().strip() for i in xrange(input())]


S = fs()

L = len(S)
for i in xrange(L):
    S[i] = list(S[i][::-1])

result = 0
for i in xrange(L):
    for j in xrange(L):
        if S[i][j] == '.':
            result += 1
            for k in xrange(j, L):
                S[i][k] = 'o'
            if i + 1 < L:
                for k in xrange(j + 1):
                    S[i + 1][k] = 'o'

print result

D: カクカク塗り - AtCoder Regular Contest 040 | AtCoder

縦横\(N\)マスの盤面と障害物があるかどうかの情報が与えられる
スタート地点が与えられるので、1マス進むごとに必ず移動方向を左右どちらか90度回転しないといけないという条件で進んだとき、同じマスを2回通らずにすべてのマスに到達できるか答える

まったくわからず

解いた人のツイート

-->