Tenka1 Programmer Beginner Contest 2019 を解いてみた(python3)
-A. [AC] On the Way
問題ページ【A - On the Way】
私のコンテスト中の解法(解説も同じような解法)
# -*- coding: utf-8 -*- a,b,c = map(int,input().split() ) if a<c<b or b<c<a: print('Yes') else: print('No')
実行時間:17 ms メモリ:2940 KB
-B. [AC] *e**** ********e* *e****e* ****e**
問題ページ【B - *e**** ********e* *e****e* ****e**】
私のコンテスト中の解法(解説も同じような解法)
# -*- coding: utf-8 -*- n = int(input()) s = list(input()) k = int(input()) c = s[k-1] for i in range(n): if s[i] != c: s[i] = '*' # 文字列に直す ans = "".join(s) print(ans)
実行時間:17 ms メモリ:3060 KB
K番目の文字を[k-1]で取得して、cに代入。
文字列Sを全部調べて、cと同じ時 '*' と置き換える。
最後にlistからstringに直して出力。
-C. Stones
問題ページ【C - Stones】
解説を参考に解いたが
解き方が合っているは分からない
# サンプル1 # . # この問題の場合、色を変更し終わったあと 次のうちどれかになる # # # # (すべて黒) # . # # (途中で白から黒に変わる) # . . # (途中で白から黒に変わる) # . . . (すべて白) どのときに一番変更が少なくなるのかを探す。
# -*- coding: utf-8 -*- n = int(input()) s = list(input()) # 黒の累積和 sum_b = [0]*(n+1) # 白の累積和 sum_w = [0]*(n+1) # 例えば # # . # (問題) # 0 1 1 2 (黒の累積和) # 0 0 1 1 (白の累積和) for i in range(n): if s[i] == '#': sum_b[i+1] = sum_b[i] + 1 else: sum_b[i+1] = sum_b[i] if s[i] == '.': sum_w[i+1] = sum_w[i] + 1 else: sum_w[i+1] = sum_w[i] ans = n for i in range(n+1): # 0番目からi番目までの黒の数 black = sum_b[i] # i+1番目からn番目(最後)までの白の数 white = sum_w[n]-sum_w[i] ans = min(ans, black + white) print(ans)
実行時間:233 ms メモリ:14148 KB
白と黒の累積和を別々に求めた。
最後のforループで、どこが白と黒の境目になったときに変更する文字が少なくなるかを探している。