개인 노트

감상


abcd4 완료
최고의 성능으로 Highst 업데이트
abc196
너무 좋아요.

A - Difference Max


x-y를 최대화하려면 x가 최대치이고 y가 최저치이며 k가 최대치이다
a, b = map(int, input().split())
c, d = map(int, input().split())

print(b - c)

B - Round Down


문자열로 숫자 X 를 입력합니다.
왼쪽 끝에서부터 한 글자 한 글자 확인하다
만약 소수점에 당첨된다면 거기서 끝내면 된다
X = input()

ans = ""
for x in X:
    if x == ".":
        break
    ans += x

print(ans)

C - Doubled


전반전과 후반전이 같으니 그중 하나만 생각하면 된다
제약은 N<10^{12}, (전부분의 수량)따라서 앞부분의 수량을 모두 검색했으면 좋겠다
경기 중의 코딩
N = int(input())

ans = 0
for i in range(1, len(str(N)) // 2 + 1):
    for j in range(10 ** (i - 1), 10 ** i):
        if int(str(j) * 2) > N:
            continue
        ans += 1

print(ans)

경기 후의 코드
N = int(input())

ans = 0
while int(str(ans) * 2) <= N:
    ans += 1

print(ans - 1)

D - Hanjo


금방 해결책을 알았지만 실수가 너무 많았어요
귀속 함수를 사용하여 다음과 같은 전체 검색을 진행하다
왼쪽 상단에서 송어를 보는데 빈 자리가 있다면
  • 다다미 반 장
  • 배치
  • 수직 배치 다다미
  • 다다미를 가로놓기
  • 세 가지 방법, 각각 시도하고, 이런 조작을 반복하다
    만일 모든 다다미가 가득 차면, 다다미의 수량과 반 장의 다다미의 수량과 조건이 일치한다면, 가능한 상황으로 계산한다
    만약 계산량이 각 칸마다 세 가지 상황을 대체적으로 고려할 수 있다면 O(3^{HW})\simO(10^7)는 실제로는 더욱 작을 것이기 때문에 문제없을 것 같다
    귀속 함수에 관해서는 이 방면이 참고가 될 수 있다
    https://qiita.com/drken/items/23a4f604fa3f505dd5ad
    https://qiita.com/drken/items/4a7869c5e304883f539b
    https://qiita.com/e869120/items/25cb52ba47be0fd418d6#3-3 - 반복 함수를 사용한 모든 검색
    디버깅에 편리하도록 now 배열 요소를 정수로 설정하지만 진리값으로 설정하면 더욱 실현하기 쉽다
    귀속 함수에서 2차원 배열을 조작하기 때문에 deepcopy를 사용하지 않으면 고장이 발생할 수 있습니다
    from copy import deepcopy
    
    
    def rec(a: int, b: int, now: list):
        """
        空いている場所を探し,そこに半畳か畳を配置していく
        全部埋まっている&畳の数が正しければ1を返す
        a: int
            現在の部屋に詰めてある長方形の畳の数
        b: int
            現在の部屋に詰めてある正方形の半畳の数
        now: list
            現在の部屋の様子(どこにどの畳が詰めてあるか)
        """
    
        # まだ畳が置かれていない(空いている)場所を探す
        y, x = -1, -1
        for i in range(H):
            for j in range(W):
                if now[i][j] == 0:
                    y, x = i, j
                    break
            if y != -1:
                break
    
        res = 0
        # 空きが無い&畳の数が正しいなら1を返す
        if y == -1 and a == A and b == B:
            res += 1
        # 1.半畳を置く場合
        if b < B:
            lst = deepcopy(now)
            lst[y][x] = b + 1
            res += rec(a, b + 1, lst)
        # 2.畳を縦に置く場合
        if y + 1 < H and now[y + 1][x] == 0 and a < A:
            lst = deepcopy(now)
            lst[y][x] = -(a + 1)
            lst[y + 1][x] = -(a + 1)
            res += rec(a + 1, b, lst)
        # 3.畳を横に置く場合
        if x + 1 < W and now[y][x + 1] == 0 and a < A:
            lst = deepcopy(now)
            lst[y][x] = -(a + 1)
            lst[y][x + 1] = -(a + 1)
            res += rec(a + 1, b, lst)
    
        return res
    
    
    H, W, A, B = map(int, input().split())
    
    ans = rec(0, 0, [[0] * W for _ in range(H)])
    print(ans)
    
    

    좋은 웹페이지 즐겨찾기