AtCoder Beginner Contest 142 / Python
● 初学者です。( 2019 / 9 ~ 現在3ヵ月目 )
● AtCoder の問題に Python で取り組んでいます。
● ABC で4問目(茶か緑)まで解けることを目標にしています。
完全に独学なのでコードは酷いと思います。
AtCoder やってる方、お気軽にコメントくださいませ。
n = int(input())
if n % 2 == 0:
print(0.5)
else:
print((n+1)/(2*n))
特に何も考えないので通った。
n,k = map(int,input().split())
h = list(map(int,input().split()))
count = 0
for i in h:
if i >= k:
count += 1
print(count)
せっかく143回で二分探索をやったので使ってみた。
from bisect import bisect_left
n,k = map(int,input().split())
h = sorted(list(map(int,input().split())))
print(n - bisect_left(h,k))
二分探索を自力で書いてみた。
n,k = map(int,input().split())
h = sorted(list(map(int,input().split())))
if k > h[n-1]:
print(0)
else:
low = 0
high = n-1
while low < high:
mid = (low + high)//2
if k > h[mid]:
low = mid +1
else:
high = mid
else:
print(n - low)
二分探索(自力)
二分探索(bisect)
普通に書いたやつ の順番。
むしろ二分探索を使って遅くなっている。
内包表記
n,k=map(int,input().split())
h=list(map(int,input().split()))
print(sum([1 for i in h if i>=k]))
3行で行けるらしい、内包表記が苦手なのを何とかしないと。
辞書に入れてバリューでソートしてみた。
n = int(input())
l = list(map(int,input().split()))
L = {}
for i in range(n):
L[i] = l[i]
sort_L = sorted(L.items(), key=lambda x:x[1])
for j in sort_L:
print(j[0]+1, end=" ")
enumerate を使えばリストで簡単に書けることが判明。
n = int(input())
l = list(map(int,input().split()))
L = [0]*n
for i, order in enumerate(l,1):
L[order-1] = i
print(*L)
下で調べた試し割法をそのまま使っている。
連除法に直したかったのだが、途中の条件がわからずに断念。
def prime_factorize(n):
a = [1]
while n % 2 == 0:
a.append(2)
n //= 2
f = 3
while f * f <= n:
if n % f == 0:
a.append(f)
n //= f
else:
f += 2
if n != 1:
a.append(n)
return a
a,b = map(int,input().split())
print(len(set(prime_factorize(a)) & set(prime_factorize(b))))
試し割り法による素因数分解。
def prime_factorize(n):
a = []
while n % 2 == 0:
a.append(2)
n //= 2
f = 3
while f * f <= n:
if n % f == 0:
a.append(f)
n //= f
else:
f += 2
if n != 1:
a.append(n)
return a
print(prime_factorize(36))
要:動的計画法
メモ:ナップサック問題
以下、参考にさせて頂きました。
難しい、12番まであるうち2番までしか読めていない。
しかし、ナップサック問題は読んだので、
Python で解答を書いている方がいたので、見てみることにした。
import sys
input = sys.stdin.readline
n,m = map(int,input().split())
dp = [float("inf")]*(1<<n)
dp[0] = 0
for _ in [0]*m:
a,b = map(int,input().split())
sc = 0
for e in map(int,input().split()):
sc += 1<<(e-1)
for i in range(1<<n):
dp[i|sc] = min(dp[i|sc],dp[i]+a)
if dp[-1] == float("inf"):
print(-1)
else:
print(dp[-1])
なんじゃこりゃ、全くわからん。
ビット演算子? |とか << が何をしているのかさっぱりだ。
もう一人いらっしゃった。
def read_key():
a, b = map(int, input().split())
m = 0
for c in map(int, input().split()):
m |= 1 << (c - 1)
return (a, m)
INF = float('inf')
N, M = map(int, input().split())
keys = [read_key() for _ in range(M)]
dp = [INF] * (1 << N)
dp[0] = 0
for i in range(M):
a, m = keys[i]
for j in range((1 << N) - 1, -1, -1):
if dp[j] == INF:
continue
if dp[j] + a < dp[j | m]:
dp[j | m] = dp[j] + a
if dp[(1 << N) - 1] == INF:
print(-1)
else:
print(dp[(1 << N) - 1])
やはり |と << がある。
無理。やはり E 問題は今やるべきじゃない、諦めよう。
もう問題が何言ってるのかわからないよね・・・
マガジン:他の回もやっていきます。
いつもありがとうございます(´っ・ω・)っ サポートから決済手数料(クレカ5%、ケータイ15%) & プラットフォーム利用料10%が引かれてしまいます、 予めご了承ください(´;ω;`)。 残りは僕のご飯になります。ベリベリありがとうございます。