こんにちは, Shinoryoです.
今回はAtCoder Beginner Contest 246を, Pythonで解いてみた結果を書き連ねていこうと思います.
AtCoder Beginner Contest 246 - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
目次[非表示]
A - Four Points
解法パターンA
collections
のCounter
を用いるとよいです.
import collections | |
# 入力 | |
x_zahyou = [] | |
y_zahyou = [] | |
for _ in range(3): | |
x_zahyou_temp, y_zahyou_temp = [int(x) for x in input().split()] | |
x_zahyou.append(x_zahyou_temp) | |
y_zahyou.append(y_zahyou_temp) | |
# x座標の出てくる回数をカウントし、 | |
# 最も少ないものの座標値を取得 | |
x_count = collections.Counter(x_zahyou) | |
x_ans = x_count.most_common()[-1][0] | |
# y座標の出てくる回数をカウントし、 | |
# 最も少ないものの座標値を取得 | |
y_count = collections.Counter(y_zahyou) | |
y_ans = y_count.most_common()[-1][0] | |
# 出力 | |
print(x_ans, y_ans) |
解法パターンB(こちらの方が標準的っぽい)
上記の「登場回数が
ならば, ならば, ならば,
以上のようにして,
# 入力 | |
x_zahyou = [] | |
y_zahyou = [] | |
for _ in range(3): | |
x_zahyou_temp, y_zahyou_temp = [int(x) for x in input().split()] | |
x_zahyou.append(x_zahyou_temp) | |
y_zahyou.append(y_zahyou_temp) | |
# x座標を求める | |
if x_zahyou[0] == x_zahyou[1]: | |
x_ans = x_zahyou[2] | |
elif x_zahyou[0] == x_zahyou[2]: | |
x_ans = x_zahyou[1] | |
else: | |
x_ans = x_zahyou[0] | |
# y座標を求める | |
if y_zahyou[0] == y_zahyou[1]: | |
y_ans = y_zahyou[2] | |
elif y_zahyou[0] == y_zahyou[2]: | |
y_ans = y_zahyou[1] | |
else: | |
y_ans = y_zahyou[0] | |
# 出力 | |
print(x_ans, y_ans) |
B - Get Closer
求めるのは,
になります.
# 入力 | |
A, B = [int(x) for x in input().split()] | |
# 出力 | |
print(A / (((A**2) + (B**2))**(1/2)), B / (((A**2) + (B**2))**(1/2))) |
C - Coupon
クーポンによる値下げには, 以下の2つのタイプがあります. クーポン使用前の値段を
- タイプ1:
のときは, から 円ぴったりが引かれる. - タイプ2:
のときは, から 円のみが引かれる.
全商品を買うための合計費用を最小化するためには, より効率的にクーポンを使用していく, つまりタイプ1の値下げをできる限り行った後に, タイプ2の値下げを行えばよいわけです.
タイプ1の値下げに関して考えます.
となります(ただし,
となります.
タイプ2の値下げに関して考えます. タイプ1のような値下げを全て仕切ってなお, クーポンが余っている場合を考えますので,
以上により, 全商品を買うための最小合計費用を求めることができます.
# 入力 | |
N, K, X = [int(x) for x in input().split()] | |
A = [int(x) for x in input().split()] | |
# 最後の出力のため | |
A_original = [a for a in A] | |
# 使うクーポン数を格納 | |
use_coupon = 0 | |
# 減額できる値段を格納 | |
discount = 0 | |
# A_1から順番に0円を下回らない範囲でクーポンを適用する | |
for i in range(N): | |
if A[i] >= X: | |
use_coupon += (A[i] // X) | |
# 使うクーポンはKより小さくなければならない | |
use_coupon = min(use_coupon, K) | |
# 残りクーポン数を計算 | |
K -= use_coupon | |
# ここまでで減額できる額を計算 | |
discount = use_coupon * X | |
# ここまでクーポンを使った後の端数の処理 | |
# 大きいのから順に引いていきたいので、端数を計算した後でソートする | |
for i in range(N): | |
A[i] %= X | |
A.sort(reverse=True) | |
# クーポンがある限り、大きい端数から消していく | |
for i in range(N): | |
if A[i] > 0 and K > 0: | |
K -= 1 | |
discount += A[i] | |
# 出力 | |
print(sum(A_original) - discount) |
D - 2-variable Function
ある整数
- 答えの初期値として,
を無限大で用意する. の値を定める( から までループ). として の値を求める. の場合は, として上に戻る. の場合は, のように更新して, に関するループを終了する.
- 結果として得られる
が答え.
なお,
そこで,
- ある
(適切な がある範囲の下限)とある (適切な がある範囲の上限)の値を用意する. と の真ん中の値として, を用意する. を求める. の値によって, 以下のように分類する. の場合は, としては より大きい値を取ることになるので, とする. の場合は, としては 以下の値を取ることになるので, とする.
と の差が になるまで, これを繰り返す.
このようにしていくことで, 最終的に
# 入力 | |
N = int(input()) | |
# a,bからa^3+a^2b+ab^2+b^3を求める関数 | |
def func(a, b): | |
return (a**3) + (a**2) * b + a * (b**2) + (b**3) | |
# 答えを格納する変数 | |
ans = float("inf") | |
# X = a^3+a^2b+ab^2+b^3を満たすXに関して、N以上で最小のものを探す | |
# 10^18がXの条件を、a = 10^6、b = 0で満たすので、aとして0~10^6を探索する | |
for a in range(0, (10**6) + 1): | |
# bに関しても0~10^6を探索する | |
# bに関してはf(a, b)が単調増加なので、二分探索を行う | |
low = -1 # 答えになるhighが0をとりうるように、-1にする | |
high = 10**6 | |
# 二分探索を実施 | |
# lowとhighの差が1になるまで続ける | |
while low + 1 < high: | |
# lowとhighの平均をとる(小数点以下切り捨て) | |
mid = (low + high) // 2 | |
# f(a, mid)の値を取得 | |
value = func(a, mid) | |
# value < Nであれば、lowはmid以上の値であることが分かる | |
if value < N: | |
low = mid | |
# value >= Nであれば、highはmid以下の値であることが分かる | |
else: | |
high = mid | |
# 得られたhighが、ansになりうるb | |
# (func(a, high) >= Nで、highは限りなく小さい) | |
# ansを更新する | |
ans = min(ans, func(a, high)) | |
# 出力 | |
print(ans) |
二分探索については「SOMPO HD プログラミングコンテスト2021(AtCoder Beginner Contest 192)をPythonで解く」でも取り上げていますので, ぜひご覧ください.
SOMPO HD プログラミングコンテスト2021(AtCoder Beginner Contest 192)をPythonで解く
こんにちは, Shinoryoです. 今回は SOMPO HD プログラミングコンテスト2021(AtCoder Beginner Contest 192) を, Pythonで解いてみた結果を書き連ねていこうと思います. AtCoder Beginner Conte...
E以降
E以降は私の能力不足故に省略いたします.
参考にしたサイト等
- 「解説 - AtCoder Beginner Contest 246」
Editorial - AtCoder Beginner Contest 246
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
- nkmk様による「PythonのCounterでリストの各要素の出現個数をカウント」
PythonのCounterでリストの各要素の出現個数をカウント | note.nkmk.me
Pythonでリストやタプルの全要素の個数は組み込み関数len(), 各要素の個数(要素ごとの出現回数)はcount()メソッドで取得できる. さらに, Python標準ライブラリcollectionsのCounterクラスを使うと, 出現回数が多い順に要素を取得できたりする. ここでは, 全要素数をカウント: len() 各要素の個数(要素ごとの出現回数)を...
0 件のコメント:
コメントを投稿 (Please feel free to ask me about your questions! You can use Japanese or English in the comments.)