AtCoderProblemsのTrainingをPython3でやる Easy編
↑これの31-40のやつです。
#31.ABC063-B Varied
各文字のcountが1以外ならnoを出せば良い。
(Yes|No)と(yes|no)みたいな部分が作問者で変わるのやりづらいので統一してほしいと思った。
s=input()
t=True
for i in s:
if s.count(i) != 1:
t=False
print("yes" if t else "no")
#32.ABC052-B Increment Decrement
N回操作しながら各xをリストにぶち込んで、最大値を取り出せば良い。
n=int(input())
s=input()
x=[0]
for i in s:
if i=="I":
x.append(x[-1]+1)
else:
x.append(x[-1]-1)
print(max(x))
#33.ABC084-B Postal Code
・A+1文字目がハイフンじゃないならNo
・A+1文字目で分割した後のいずれかの中にハイフンが入ってるならNo
・それ以外ならYes
を出せば良い。
a,b=map(int,input().split())
s=input()
t=True
if s[a]=="-":
x,y=s[:a],s[a+1:]
if "-" in x or "-" in y:
t=False
else:
t=False
print("Yes" if t else "No")
#34.ABC087-B Coins
単純に全探索しよう。制約から3重ループで問題ないことがわかる。
a=int(input())
b=int(input())
c=int(input())
x=int(input())
res=0
for i in range(a+1):
for j in range(b+1):
for k in range(c+1):
tmp=i*500+j*100+k*50
if tmp==x:
res+=1
print(res)
#35.ABC071-B Not Found
a-zまでを昇順に並べて、順番にSの中に入ってるか見ていく。
全部入っていたらNoneを出す。
s=input()
alpha="abcdefghijklmnopqrstuvwxyz"
res="None"
for i in alpha:
if not i in s:
res=i
break
print(res)
#36.ABC127-C Prison
LとRをそれぞれリストにして$R_{min}-L_{max}+1$を返せば良い。
$R_{min}-L_{max}<0$の場合も考慮した。
なんかうまいこと内包表記とかでLとRが書けないものでしょうか。
n,m=map(int,input().split())
l=[]
r=[]
for i in range(m):
tmp=list(map(int,input().split()))
l.append(tmp[0])
r.append(tmp[1])
print(max(min(r)-max(l)+1,0))
#37.ABC141-C Attack Survival
単純にポイントを引いていくとTLE。
n,k,q=map(int,input().split())
a=[int(input())-1 for i in range(q)]
point=[k-(q-a.count(i)) for i in range(n)]
for i in point:
print("Yes" if i>0 else "No")
わからないので解説見てやったパターンがこれ。
これだとTLEする。した。
書いてる今気づきましたが、これだと計算量O(n*q)ですね。
n,k,q=map(int,input().split())
a=[int(input())-1 for i in range(q)]
for i in range(n):
print("Yes" if k-q+a.count(i)>0 else "No")
読み違えているっぽいことに気が付いたので直した結果AC。
こっちだとO(q+n)になってる。のかな。
めちゃくちゃ詰まったので死にたい。あと全部の解説にコードをちゃんとつけて欲しい。
n,k,q=map(int,input().split())
a=[int(input())-1 for i in range(q)]
point=[k-q for i in range(n)]
for i in a:
point[i]+=1
for i in point:
print("Yes" if i>0 else "No")
#38.ABC123-B Five Dishes
mod10が0以外で一番小さいやつを最後に回すと良い。
もっとうまい書き方がありそうな気がする。
from math import ceil
time=[int(input())for i in range(5)]
mod=[i%10 for i in time]
a=124
res=0
for i in range(len(mod)):
if mod[i] !=0:
a=min(a,mod[i])
if a==124:
a=0
for i in range(5):
if i==mod.index(a):
res+=time[i]
else:
res+=ceil(time[i]/10)*10
print(res)
#39.ABC134-C Exception Handling
一番大きい要素を$A_{max}$とすると、各iに対して
・$i$が$A_{max}$のインデックスならそれを除いた範囲で最大の奴
・そうでないなら$A_{max}$
を出力すればよい。
n=int(input())
a=[int(input())for i in range(n)]
a_max=max(a)
index_max=a.index(a_max)
for i in range(n):
if i==index_max:
print(max(a[:index_max]+a[index_max+1:]))
else:
print(a_max)
#40.AGC002-A Range Product
いくつかの場合にわけます。
1.まず$a>0$の場合$a,a+1,...,b$は全部正の数なので、当然その積も正の数。
2.次に$a<0$かつ$b>0$の場合どこかに0が入るので積は0。
3.$b<0$の場合$a,a+1,...,b$が偶数個か奇数個かで積の正負が変わります。
aとbの偶奇が同じなら奇数個、違うなら偶数個です。
奇数個なら負の数、偶数個なら正の数になりますね。
そんな感じでやりました。
解説見たら$b-a+1$の偶奇で判別してますね。なるほどね。
a,b=map(int,input().split())
if a>0:
print("Positive")
elif a<0 and b>0:
print("Zero")
else:
if a%2 ==b%2:
print("Negative")
else:
print("Positive")
#おわりに
めちゃくちゃ詰まった問題の解説にコードがないと何が間違ってるのか気づきづらいのでやめて欲しいなあと思った。
コードが付いてたら37のやつも読み違えてることにすぐ気づけたはずなので……。