0
0

More than 1 year has passed since last update.

超初心者がAtcoder ProblemsのB問題を128回から135回までpythonで解いてみた件【ほぼ自分用】

Last updated at Posted at 2022-02-02

解き方を忘れないためにまとめてるだけなのでコードはめちゃくちゃ不細工です、ここもっと良くできるよって場所あったら教えていただけるとありがたいです!!

Guidebook

practice.py
n = int(input())
restaurants = [list(input().split()) for _ in range(n)]
ans = []
for i in range(n):
    ans.append([i+1,restaurants[i][0],int(restaurants[i][1])])
ans = sorted(ans, key=lambda x:x[2],reverse=True)
ans = sorted(ans, key=lambda x:x[1])
for ans_line in ans:
    print(ans_line[0])

最初にそれぞれのレストランの番号をインデックス番号+1でそれぞれのリストに加えておきます。次に評価が高い順に表示をしていきたいのでlambda式を使って、それぞれのレストランの評価でsortをします。最後にレストランの名前を辞書順でsortして、for文を回して出力します。

Balance

practice.py
n = int(input())
weights = list(map(int, input().split()))
ans = 10000000000000000
for i in range(1,n):
    lw = []
    hw = []
    for idx, weight in enumerate(weights):
        if idx > i:
            hw.append(weight)
        else:
            lw.append(weight)
    temp = abs(sum(hw)-sum(lw))
    ans = min(ans,temp)
print(ans)

tの値は1<=t<nなので、全く同じ範囲でfor文を回します。enumerateでインデックス番号と重りの値を取得し、インデックス番号でどっちのリストに入るか判定して、appendで挿入していきます。最後に大きい方から小さい方を引いた値を絶対値で取得し、既存のansの値より小さいかを判定していきます。

Bounding

practice.py
n,x = map(int, input().split())
Llist = list(map(int, input().split()))
d = 0
dlist = [0]
anslist = []
for i in range(n):
    d += Llist[i]
    dlist.append(d)
for dpoint in dlist:
    if dpoint <= x:
        anslist.append(dpoint)
print(len(anslist))

0では絶対に跳ね返るのでdlistにあらかじめ0を入れておきます、その後に跳ね返るポイントを問題文に従って挿入していき、最後にx以下のポイントは何個あるかをfor文で判定してその個数を出力するだけです。

Bite Eating

practice.py
n,l = map(int, input().split())
tastes = []
for i in range(1,n+1):
    taste = l + i - 1
    tastes.append(taste)
if max(tastes) < 0:
    print(sum(tastes)-max(tastes))
else:
    min_apple = max(min(tastes),0)
    print(sum(tastes)-min_apple)

まず全てのリンゴの味をリストに格納して、リンゴの味の最大値が負の数の場合は数を抜く前のパイの味からリンゴの味の最大値を引いて出力します。もしリンゴの味の最大値が正の数の場合は0以上で一番味の値が小さいリンゴの値をmin_appleに格納して数を抜く前のパイの味からmin_appleの値を引いて出力します。

Ordinary Number

practice.py
n = int(input())
numbers = list(map(int,input().split()))
total = 0
for i in range(n-2):
    temp_numbers = [numbers[i],numbers[i+1],numbers[i+2]]
    num = sorted(temp_numbers)[-2]
    if temp_numbers.index(num) == 1:
        total += 1
print(total)

全探索で考えられる3つの数字の組み合わせを全て洗い出して、2番目に小さい値が真ん中にある数字と一致するか判定し、一致するならtotalに1を足していくだけ。

Good Distance

practice.py
n,d = map(int, input().split())
points = [list(map(int, input().split())) for _ in range(n)]
total = 0
for i in range(n):
    for j in range(i+1,n):
        temp = 0
        for k in range(d):
            temp += ((points[i][k]-points[j][k])**2)
        if (temp**0.5).is_integer():
            total += 1
print(total)

考えられる点同士の繋がりを全探索してから距離を与えられた公式に沿って求め出して、整数かを判定していくだけです。

Golden Apple

practice.py
import math
n,d = map(int, input().split())
range = 2*d+1
print(math.ceil(n/range))

一人の監視官が見張れる範囲は2*d+1なのでrangeに格納します、そしてmathライブラリのceilメソッドという切り上げの割り算ができるメソッドを使って、木の本数割るrangeの切り上げを出力します。

0 or 1 Swap

practice.py
n = int(input())
numbers = list(map(int, input().split()))
if numbers == sorted(numbers):
    print("YES")
    exit()
for i in range(n):
    for j in range(i+1,n):
        damy = numbers[::]
        damy[i], damy[j] = damy[j], damy[i]
        if damy == sorted(numbers):
            print("YES")
            exit()
print("NO")

考えられる全てのパターンを全探索していきます、damyを作らないと一回以上の交換をするのと同じことになってしまうので一回for文が回るごとにdamyを作って値をリセットしていく必要があります。

0
0
1

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