AtCoderProblemsのTrainingをPython3でやる Easy編
↑これの1-10のやつです。
1.ABC139-B Power Socket
A個口のタップをx個使った時の未使用の差込口はx*(A-1)+1個なので、それがBを超えるまでxに+1しようと考えました。
whileの条件式とにらめっこしてると、なんで(a-1)/(b-1)を使った良い感じの奴1にしなかったのかという気持ちになりました。
a,b=map(int,input().split())
x=0
while x*(a-1)+1<b:
x+=1
print(x)
2.ABC156-C Rally
リスト内包表記を使うと短くかけてオシャレですね。
pは0から100の各座標で開いたときの消費する体力の総和を全列挙して、そこから最小値を出せば良いよねと考えました。
n=int(input())
x=[int(i)for i in input().split()]
p=[sum([(j-i)**2 for j in x]) for i in range(101)]
print(min(p))
3.CODE FESTIVAL 2016 qua-B Qualification simulator
問題文に書いてあることをそのまま愚直に全列挙しました。
解説もそんなものでしたね。
n,a,b=map(int,input().split())
s=input()
passed=0
rank_b=1
for i in range(n):
if s[i]=="a":
if passed<a+b:
print("Yes")
passed+=1
else:
print("No")
elif s[i]=="b":
if passed<a+b and rank_b<=b:
print("Yes")
rank_b+=1
passed+=1
else:
print("No")
else:
print("No")
4.三井住友信託銀行プログラミングコンテスト2019-B Tax Rate
最初Nを1.08で割ってどうにかしようとしたのですが、頭がパーになってアーッアアアーッとなったので愚直に調べる方法になりました。
解説を見たら切り上げと切り捨てを使っててなるほどなーとなりました。
n=int(input())
res=0
for i in range(1,n+1):
if int(i*1.08)==n:
res=i
if res != 0:
print(res)
else:
print(":(")
5.ABC121-B Can you solve this?
愚直に全部計算しました。
解説も解法がどうこうというより実装の仕方が主でしたね。
n,m,c=map(int,input().split())
b=[int(i)for i in input().split()]
a=[[int(i)for i in input().split()]for j in range(n)]
res=0
for i in range(n):
tmp=sum([a[i][j]*b[j]for j in range(m)])+c
if tmp>0:
res+=1
print(res)
#6.パナソニックプログラミングコンテスト2020-B Bishop
左上を(0,0)として各マスを(x,y)とすると、x+yが偶数のマスにしかビショップは移動できないです。
以上を踏まえて愚直に全探索したらTLEしました。
h,w=map(int,input().split())
canMove=sum([[(i+j)%2==0 for i in range(w)]for j in range(h)],[])
print(canMove.count(True))
よく見ると入力が$10^9$なんですね。なんて性格の悪い
そこで、x+yが偶数のマスにしか移動できないことに注目しました。
つまりh*w/2(端数切り上げ)を返せば良いわけですね。
また、hかwが1の場合、初期位置からまったく動かせないことを忘れてはいけません。私はこれでWAを出しました。
なんかこの問題はBっぽくない感じがしました。
全探索するとTLEしたりコーナーケースがあったり……。
from math import ceil
h,w=map(int,input().split())
ans=0
if h==1 or w==1:
ans=1
else:
ans=ceil(h*w/2)
print(ans)
7.ABC157-B Bingo
タテ、ヨコ、ナナメのそれぞれで全部出たかを調べれば良いですね。
def bingo():
for i in a:
if i[0] in b and i[1] in b and i[2] in b:
return True
for i in range(3):
if a[0][i] in b and a[1][i] in b and a[2][i] in b:
return True
tmp=[(a[i][i] in b) for i in range(3)]
if tmp.count(True)==3:
return True
tmp=[a[0][2] in b,a[1][1] in b,a[2][0] in b]
if tmp.count(True)==3:
return True
a=[[int(i)for i in input().split()]for j in range(3)]
n=int(input())
b=[int(input())for i in range(n)]
bingo=bingo()
print("Yes" if bingo else "No")
8.ABC086-B 1 21
aとbをつなげた数cが平方数ならその平方根dは整数になるので、dの端数を切り捨てた後2乗したものがcと一致するはずですね。
解説を見たら1000までループして全探索してましたが、316までで良いと思いました^2。
a,b=input().split()
c=int(a+b)
d=int(c**0.5)
print("Yes" if d**2==c else "No")
9.ABC074-B Collecting Balls(Easy Version)
制約から各直線y=i(1<=i<=N)上は
ロボA---ボール---ロボB
という感じになるので、i番目のボールを回収するコスト$c_i$は$2x_i$か$2(K-x_i)$のうち小さいほうを求めて、それを全部足せば良いと考えました。
n=int(input())
k=int(input())
x=[int(i)for i in input().split()]
cost=sum([min(i,k-i)*2 for i in x])
print(cost)
10.ABC088-B Card Game for Two
最初、アリスとボブの得点を求めてたんですが、よくよく考えたら変数は1つで充分でした。
降順にソートしてi番目(1<=i<=n)のカードのカードの数を、iが奇数なら
足して偶数なら引けば良いんですね。
以下のコードはiが0-indexedだし昇順ソートで後ろから取ってます。
n=int(input())
a=sorted([int(i)for i in input().split()])
res=0
for i in range(n):
tmp=a.pop(-1)
if i%2==0:
res+=tmp
else:
res-=tmp
print(res)
#おわりに
やっぱり6だけおかしくない???????
-
公式の解説に乗ってるやつのこと ↩