0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

競技プログラミング 日記 python 20201213

Posted at

  • A - ABC Preparation

与えられた4つの数字の最も小さい物を出力すれば良い

print(min(list(map(int, input().split()))))
  • B - Smartphone Addiction

コードは汚いが、カフェに入ったタイミングと終了時にバッテリーが0以下かどうを判定すれば良さそうという思想で実装
バッテリーは最大容量以上にはならないことを最初忘れていたのがミス

n, m, t = map(int, input().split())
max_n = n
now = 0
ans = "Yes"
for i in range(m):
    a, b = map(int, input().split())
    n = n - a + now
    if n <= 0:
        ans = "No"
        break
    n = min(n + (b - a), max_n)
    now = b
if n - t + now <= 0:
    ans = "No"
    
print(ans)    
  • C - Duodecim Ferra

長さLのぼうを11箇所で切断するときの分け方が何通りか。受験でよく出そうな問題ではある

整数の長さになるよう分割なので、切断箇所は L - 1箇所。 L - 1 C 11 とかで求まるか

from math import factorial

L = int(input())

print(int(factorial(L - 1) / factorial(L - 12) / factorial(11)))

と思ったが、これではだめ。
解説を読むと

注意しなければいけないのは、この分数自体の値は
2 ** 63
未満ですが、分子は
64 bit 整数型に収まらないことがあるという点です。オーバーフローを回避する方法はいくつかあります。

int64のサイズを超えるからアウトか。。この発想はなかった。
パスカルの三角形を用いて、漸化式敵に解くのが良さそう

メモ化再帰のようなことをしてみた。関数が副作用満点なので気持ち悪い

from math import factorial

L = int(input())
matrix = [[[] for _ in range(201)] for _ in range(201)]

def pascal(i, j):
    if matrix[i][j]:
        return matrix[i][j]
    if j == 0 or i == j:
        return 1
    ans = pascal(i-1, j-1) + pascal(i-1, j)
    matrix[i][j] = ans
    return(pascal(i-1, j-1) + pascal(i-1, j))
    
print(pascal(L-1, 11))
  • D - Stamp

スタンプの作り方は、白いマスの連続する数のうち最も小さい物を採用すればよさそう
幅4のスタンプなら、5のますはスタンプを2回使うことで塗りつぶすことができる

n, m = map(int, input().split())
if m == 0:
    print(1)
    exit()

a = sorted(list(map(int, input().split())))
white = []
for i in range(len(a)):
    if i == 0:
        white.append(a[i] - 1)
    elif i == (len(a) - 1):
        white.append(a[i] - a[i-1] -1)
        white.append(n - a[i])
    else:
        white.append(a[i] - a[i-1] -1)
white = list(filter(lambda x: x != 0, white))
if len(white) == 0:
    print(0)
    exit()
k = min(white)

ans = 0
for l in white:
    x = l // k
    amari = l % k
    if amari != 0:
        x += 1
    ans += x

print(ans)

かなり場当たり的だが、、一応通った

今回はここまで!

0
0
0

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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?