tag:crieit.net,2005:https://crieit.net/magazines/aocory/Python%E3%81%A7%E7%AB%B6%E3%83%97%E3%83%AD/feed
Pythonで競プロの投稿 - Crieit
Crieitで連載「Pythonで競プロ」の最近の投稿
2019-06-14T07:56:24+09:00
https://crieit.net/magazines/aocory/Python%E3%81%A7%E7%AB%B6%E3%83%97%E3%83%AD/feed
tag:crieit.net,2005:PublicArticle/15105
2019-06-14T07:56:24+09:00
2019-06-14T07:56:24+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-123C-Python
# AtCoder Beginner Contest 123CをPythonで解く
<h1 id="Five Transportations"><a href="#Five+Transportations">Five Transportations</a></h1>
<ol>
<li><a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc123/tasks/abc123_c">Five Transportations</a></li>
</ol>
<h2 id="問題"><a href="#%E5%95%8F%E9%A1%8C">問題</a></h2>
<blockquote>
<p>AtCoder社は成長し、2028 年になってついに6つの都市 (都市1,2,3,4,5,6) からなる AtCoder 帝国を作りました!<br />
AtCoder帝国には5つの交通機関があります。<br />
電車:都市1から2まで1分で移動する。1つの電車にはA人まで乗ることができる。<br />
バス:都市2から3まで1分で移動する。1つのバスには B人まで乗ることができる。<br />
タクシー:都市3から4まで1分で移動する。1つのタクシーにはC人まで乗ることができる。<br />
飛行機:都市4から5まで1分で移動する。1つの飛行機にはD人まで乗ることができる。<br />
船:都市5から6までを1分で移動する。1つの船にはE人まで乗ることができる。<br />
それぞれの交通機関は、各整数時刻 (0,1,2,3,...) に、都市から出発します。<br />
いま、N人のグループが都市1におり、全員都市6まで移動したいです。全員が都市<br />
6に到着するまでに最短で何分かかるでしょうか?<br />
なお、乗り継ぎにかかる時間を考える必要はありません。</p>
</blockquote>
<h2 id="こう考えた"><a href="#%E3%81%93%E3%81%86%E8%80%83%E3%81%88%E3%81%9F">こう考えた</a></h2>
<ul>
<li>詰まるポイントのA1>A2はA1/A2の切り上げ分時間がかかる。</li>
<li>Forループでそれぞれの時間を計算して追加する。</li>
</ul>
<blockquote>
<p>🐍これでいけんちゃうかな?入力のところは改善できるはず。</p>
</blockquote>
<h2 id="書いたコード"><a href="#%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">書いたコード</a></h2>
<pre><code class="python">import math
L=[int(input()) for i in range(6)]
Step=0
min=L[0]
for i in range(5):
if min > L[i+1]:
Step=Step+math.ceil(min/L[i+1])
min=L[i+1]
else:
Step=Step+1
print(Step)
</code></pre>
<blockquote>
<p>🐍これならループも5回やしTLEにはならへんやろ。。</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>WA!!</p>
<blockquote>
<p>🐍WA!!</p>
</blockquote>
<h2 id="解説読む"><a href="#%E8%A7%A3%E8%AA%AC%E8%AA%AD%E3%82%80">解説読む</a></h2>
<blockquote>
<p>最も通りにくい、つまり容量が最も小さい交通機関を考えます。直感的には、最短時間で移動する場合でも、1 分でたどり着けるのは 𝑋 人 (交通機関の容量の最小を 𝑋 とする) になります。これは、「1秒に 15 L のペースで水を送れるポンプと、1 秒に 12 L のペースで水を送れるポンプをつなげたときに、1 秒に送れる水の量は小さい方を取って 12 L」 になるのと同じ原理です。つまり、先ほどの貪欲的な方法ではなくて、1 分に 𝑋 人ずつ 1 つ先に進めてやっても、直感的には<br />
かかる時間は変わらなさそうです。また、移動時間は 「(𝑁 ÷ 𝑋 を切り上げた値) + 4 分」 と、簡単に計算できるようになります。</p>
<p>🐍WA!!</p>
</blockquote>
<h2 id="解説を読んで実装したコード"><a href="#%E8%A7%A3%E8%AA%AC%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A7%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">解説を読んで実装したコード</a></h2>
<pre><code class="python">import math
N=int(input())
L=[int(input()) for i in range(5)]
m=math.ceil(N/min(L))
print(m+4)
</code></pre>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>AC!!</p>
<blockquote>
<p>🐍でけたで!</p>
</blockquote>
aocory
tag:crieit.net,2005:PublicArticle/15102
2019-06-13T08:22:34+09:00
2019-06-13T08:22:34+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-063b-Python
AtCoder Beginner Contest 063bをPythonで解く
<h1 id="AtCoder Beginner Contest 063bをPythonで解く"><a href="#AtCoder+Beginner+Contest+063b%E3%82%92Python%E3%81%A7%E8%A7%A3%E3%81%8F">AtCoder Beginner Contest 063bをPythonで解く</a></h1>
<p>今回は、<a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc073/tasks/abc063_b">AtCoder Beginner Contest 063b</a>を解いていきたいと思います。</p>
<h2 id="問題"><a href="#%E5%95%8F%E9%A1%8C">問題</a></h2>
<blockquote>
<p>英小文字からなる文字列Sが与えられます。Sに含まれる文字がすべて異なるか判定してください。</p>
</blockquote>
<h2 id="こう考えた"><a href="#%E3%81%93%E3%81%86%E8%80%83%E3%81%88%E3%81%9F">こう考えた</a></h2>
<ul>
<li><code>set()</code>に変換し長さを取得</li>
<li><code>len(S)</code>と<code>set(len(S))</code>を比較し同じであればYes、そうでなければNo</li>
</ul>
<h2 id="書いたコード"><a href="#%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">書いたコード</a></h2>
<pre><code class="python">S=input()
if len(set(S))==len(S):
print("yes")
else:
print("no")
</code></pre>
<blockquote>
<p>🐍これでいけんちゃうかな?</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>AC!!</p>
<blockquote>
<p>🐍おし!</p>
</blockquote>
<h2 id="勉強になったコード"><a href="#%E5%8B%89%E5%BC%B7%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">勉強になったコード</a></h2>
<pre><code class="python"><br />a=input();print(['no','yes'][len(a)==len(set(a))])
</code></pre>
<blockquote>
<p>🐍<code>print([][])</code>みたいなので条件かけるんや</p>
</blockquote>
aocory
tag:crieit.net,2005:PublicArticle/15101
2019-06-13T08:03:00+09:00
2019-06-13T08:03:00+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-122c-Python
AtCoder Beginner Contest 122cをPythonで解く
<h1 id="GeT AC"><a href="#GeT+AC">GeT AC</a></h1>
<ol>
<li><a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc122/tasks/abc122_c">GeT AC</a></li>
</ol>
<h2 id="問題"><a href="#%E5%95%8F%E9%A1%8C">問題</a></h2>
<blockquote>
<p>A, C, G, T からなる長さNの文字列 Sが与えられます。以下の Q個の問いに答えてください。問 i (1≤i≤Q): 整数 li,ri (1≤li<br />
Sの先頭から li 文字目から ri 文字目までの (両端含む) 部分文字列を考える。この文字列に AC は部分文字列として何回現れるか。</p>
</blockquote>
<h2 id="こう考えた"><a href="#%E3%81%93%E3%81%86%E8%80%83%E3%81%88%E3%81%9F">こう考えた</a></h2>
<ul>
<li><code>count</code>でACの数を計算して出力する。</li>
</ul>
<h2 id="書いたコード"><a href="#%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">書いたコード</a></h2>
<pre><code class="python">N,Q=map(int,input().split())
S=input()
for q in range(Q):
l,r=map(int,input().split())
s=S[l-1:r]
print(s.count("AC"))
</code></pre>
<blockquote>
<p>🐍これでいけんちゃうかな?</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>TLE</p>
<blockquote>
<p>🐍計算量の問題か</p>
</blockquote>
<h2 id="Atcoderの標準回答"><a href="#Atcoder%E3%81%AE%E6%A8%99%E6%BA%96%E5%9B%9E%E7%AD%94">Atcoderの標準回答</a></h2>
<pre><code class="python">N,Q=map(int,input().split())
S=input()
t = [0] * (N + 1)
for i in range(N):
t[i + 1] = t[i] + (1 if S[i : i + 2] == 'AC' else 0)
for q in range(Q):
l,r=map(int,input().split())
print(t[r-1] - t[l-1])
</code></pre>
<blockquote>
<p>🐍ACのカウントの配列をつくるんやな。</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>AC</p>
<blockquote>
<p>🐍文字列検索って結構時間喰うねんな。。</p>
</blockquote>
aocory
tag:crieit.net,2005:PublicArticle/15097
2019-06-12T11:27:17+09:00
2019-06-12T11:27:17+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-129D-Python
AtCoder Beginner Contest 129DをPythonで解く
<h1 id="AtCoder Beginner Contest 129DをPythonで解く"><a href="#AtCoder+Beginner+Contest+129D%E3%82%92Python%E3%81%A7%E8%A7%A3%E3%81%8F">AtCoder Beginner Contest 129DをPythonで解く</a></h1>
<p>今回は、<a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc129/tasks/abc129_d">AtCoder Beginner Contest 129D</a><br />
を解いていきたいと思います。</p>
<h2 id="問題文"><a href="#%E5%95%8F%E9%A1%8C%E6%96%87">問題文</a></h2>
<blockquote>
<p>縦H行横W列のグリッドが与えられます。このグリッドのうち、いくつかのマスには障害物が存在します。すぬけ君は、障害物のないマスのうち一つを選び、そのマスに明かりを設置しようとしています。 設置されたマスから、上下左右の四方向にまっすぐに光線が伸びます。それぞれの方向について、最初に障害物が存在するマスにぶつかる、もしくはグリッドの端にぶつかる手前のマスまで照らされます。明かりを設置したマスも照らされますが、障害物が存在するマスは照らされません。<br />
すぬけ君は明かりによって照らされるマスの個数を最大化したいです。<br />
H個の長さWの文字列 Si(1≤i≤H)が与えられます。Siの j文字目 (1≤j≤W) が # のとき、グリッドの上からi行目で左からj列目のマスには障害物があり、 . のときは障害物がありません。<br />
照らされるマスの個数の最大値を求めてください。</p>
</blockquote>
<h2 id="こう考えた"><a href="#%E3%81%93%E3%81%86%E8%80%83%E3%81%88%E3%81%9F">こう考えた</a></h2>
<ul>
<li>numpyを使う</li>
<li>二次元配列に<code>[h,w]</code>を入力する空の配列を作る。</li>
<li>マス目毎に上、下、右、左を確認するコードを作成し、h,wに格納する。</li>
<li><code>max()</code>で出力</li>
</ul>
<h2 id="書いたコード"><a href="#%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">書いたコード</a></h2>
<pre><code class="python">L=[list(input() )for i in range(H)]
L = np.array(L)
print(L)
M=[]
for h in range(H):
for w in range(W):
if L[h][w]=="#":
M.append([0,0])
else:
R=1
for r in range(W-w-1):
if L[h][w+r+1]==".":
R=R+1
else:
break
for r in range(w-1):
if L[h][w-r-1]=="." and w-r-1>=0:
R=R+1
else:
break
M.append(R)
print(M)
</code></pre>
<blockquote>
<p>🐍ここまで書いたけど知識不足で書けない。。</p>
</blockquote>
<h2 id="コードを読んでみる"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%BF%E3%82%8B">コードを読んでみる</a></h2>
<pre><code class="python">from numpy import*
h,*s=open(0)
h,w=int64(h.split())
r=range
s=array([list(t[:-1])for t in s])
a,b,c,d=eval('zeros((h,w),"i"),'*4)
for i in r(w):
a[:,i]=-~a[:,i-1]*(s[:,i]>'#')
b[:,~i]=-~b[:,-i]*(s[:,~i]>'#')
for i in r(h):
c[i,:]=-~c[i-1,:]*(s[i,:]>'#')
d[~i,:]=-~d[-i,:]*(s[~i,:]>'#')
print(int((a+b+c+d).max())-3)
</code></pre>
<h3 id="3行目まで"><a href="#3%E8%A1%8C%E7%9B%AE%E3%81%BE%E3%81%A7">3行目まで</a></h3>
<pre><code class="python">h,*s=open(0)
print(h)
print(s)
h,w=int64(h.split())
print(h)
print(w)
</code></pre>
<blockquote>
<p>🐍とりあえず出力確認や</p>
</blockquote>
<pre><code class="python">4 6
['#..#..\n', '.....#\n', '....#.\n', '#.#...']
4
6
</code></pre>
<blockquote>
<p>🐍なるほど</p>
</blockquote>
<pre><code class="python">r=range
</code></pre>
<blockquote>
<p>🐍なるほど後で<code>for i in range()</code>が何度か出てくるからここで定義してるねんな。</p>
</blockquote>
<pre><code class="python">s=array([list(t[:-1])for t in s])
</code></pre>
<blockquote>
<p>🐍numpyのarrayに変換してるねんな。なんで<code>[list(t[:-1])</code>なんやろ?</p>
</blockquote>
<pre><code class="python">[['#', '.', '.', '#', '.', '.'] ['.', '.', '.', '.', '.', '#']
['.', '.', '.', '.', '#', '.'] ['#', '.', '#', '.', '.']]
['#..#..\n' '.....#\n' '....#.\n' '#.#...']
</code></pre>
<blockquote>
<p>🐍1次元配列なるし、改行も含まれてまうねんな。</p>
</blockquote>
<pre><code class="python">a,b,c,d=eval('zeros((h,w),"i"),'*4)
</code></pre>
<blockquote>
<p>🐍 eval は第1引数を式として評価してるから<code>'zeros((h,w),"i"),'</code>までが今回は引数。zerosは、0で初期化されたndarrayを生成する関数やな。abcdで4つ生成してるねんな。</p>
</blockquote>
<pre><code class="python">for i in r(w):
a[:,i]=-~a[:,i-1]*(s[:,i]>'#')
b[:,~i]=-~b[:,-i]*(s[:,~i]>'#')
</code></pre>
<pre><code>Traceback (most recent call last):
File "./Main.py", line 8, in <module>
a[:,i]=-~a[:,i-1]*(s[:,i]>'#')
IndexError: too many indices
</code></pre>
<blockquote>
<p>🐍 ACしてるのにエラーでるな。このコードの読コードはここまでや。</p>
</blockquote>
<h3 id="参考にしたコード"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">参考にしたコード</a></h3>
<pre><code class="python">import numpy as np
H,W=map(int,input().split())
S=[list(input()) for h in range(H)]
S=[[1 if s=='.' else 0 for s in S[h]] for h in range(H)]
S=np.array(S)
L=S.copy()
R=S.copy()
U=S.copy()
D=S.copy()
for w in range(1,W):
L[:,w]=(L[:,w-1]+1)*S[:,w]
R[:,-(1+w)]=(R[:,-w]+1)*S[:,-(1+w)]
for h in range(1,H):
U[h,:]=(U[h-1,:]+1)*S[h,:]
D[-(1+h),:]=(D[-h,:]+1)*S[-(1+h),:]
print(int((L+R+U+D).max())-3)
</code></pre>
<pre><code class="python">S=[[1 if s=='.' else 0 for s in S[h]] for h in range(H)]
[[0, 1, 1, 0, 1, 1], [1, 1, 1, 1, 1, 0], [1, 1, 1, 1, 0, 1], [0, 1, 0, 1, 1, 1]]
</code></pre>
<blockquote>
<p>🐍 ここは文字列を0と1に置き換えてるんやな。</p>
</blockquote>
<pre><code class="python">L[:,w]=(L[:,w-1]+1)*S[:,w]
</code></pre>
<blockquote>
<p>🐍 <code>,</code>ってなんや外したろ</p>
</blockquote>
<pre><code class="python">Traceback (most recent call last):
File "./Main.py", line 12, in <module>
L[:w]=(L[:w-1]+1)*S[:w]
ValueError: could not broadcast input array from shape (0,6) into shape (1,6)
</code></pre>
<blockquote>
<p>🐍多次元の場合は、カンマ(,)で区切ってそれぞれを指定せなあかんねんな。</p>
</blockquote>
aocory
tag:crieit.net,2005:PublicArticle/15096
2019-06-12T08:28:48+09:00
2019-06-12T08:28:48+09:00
https://crieit.net/posts/AtCoder-Beginner-Contest-090B-Python
AtCoder Beginner Contest 090BをPythonで解く
<h1 id="AtCoder Beginner Contest 090BをPythonで解く"><a href="#AtCoder+Beginner+Contest+090B%E3%82%92Python%E3%81%A7%E8%A7%A3%E3%81%8F">AtCoder Beginner Contest 090BをPythonで解く</a></h1>
<p>今回は、<a target="_blank" rel="nofollow noopener" href="https://atcoder.jp/contests/abc073/tasks/abc090_b">AtCoder Beginner Contest 090B</a>を解いていきたいと思います。</p>
<h2 id="問題"><a href="#%E5%95%8F%E9%A1%8C">問題</a></h2>
<blockquote>
<p>A以上B以下の整数のうち、回文数となるものの個数を求めてください。 ただし、回文数とは、先頭に0をつけない10進表記を文字列として見たとき、前から読んでも後ろから読んでも同じ文字列となるような正の整数のことを指します。</p>
</blockquote>
<h2 id="考え方"><a href="#%E8%80%83%E3%81%88%E6%96%B9">考え方</a></h2>
<ul>
<li>文字列で入力をうけて</li>
<li>[-1::-1]で逆の文字列を作成</li>
<li><code>if</code>文で逆の文字列と入力の文字列が同じならカウントを1追加</li>
</ul>
<h2 id="実際書いたコード"><a href="#%E5%AE%9F%E9%9A%9B%E6%9B%B8%E3%81%84%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">実際書いたコード</a></h2>
<pre><code class="python">A,B=map(int,input().split())
n=0
for i in range(A,B):
C=(str(i)[-1::-1])
if int(C)==i:
n=n+1
print(n)
</code></pre>
<blockquote>
<p>🐍これでいけそう</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>WA</p>
<blockquote>
<p>🐍あっ、rangeは<code>B+1</code>にしなあかん。</p>
</blockquote>
<h2 id="修正したコード"><a href="#%E4%BF%AE%E6%AD%A3%E3%81%97%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">修正したコード</a></h2>
<pre><code class="python">A,B=map(int,input().split())
n=0
for i in range(A,B+1):
C=(str(i)[-1::-1])
if int(C)==i:
n=n+1
print(n)
</code></pre>
<blockquote>
<p>🐍これでいけそう</p>
</blockquote>
<h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2>
<p>AC</p>
<blockquote>
<p>🐍ケアレスミスや</p>
</blockquote>
<h2 id="勉強になったコード"><a href="#%E5%8B%89%E5%BC%B7%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89">勉強になったコード</a></h2>
<pre><code class="python">a,b=map(int,input().split())
print(len([i for i in map(str,range(a,b+1)) if i==i[::-1]]))
</code></pre>
<blockquote>
<p>🐍 <code>map(str,)</code>を<code>range</code>につかえるんや。</p>
</blockquote>
aocory