注意
単なる雑談。有用なことは書かないので了解願う。
1オリジン問題
慣れないPythonながらなんとか茶色になった。時間制限の中で書くのに慣れず相変わらずしょうもないミスをしてDまで解けないことが多い。
そんな中、問題の性質として配列操作が多く、問題ではiが1~Nで定義されているが単純に以下のように処理すると0オリジンになってしまう。
iが直接意味を持つため、1オリジン化しないと処理出来ない。
a = list(map(int,input().split())
for i in range(1,n+1): # 1 to n
if( i%3==0 ):
ans += a[i-1] # 0オリジンアクセス
このベース変換はソース上に無限に増えていくので非常に煩わしくバグの原因になる。(というかなった)
というわけで配列の方を1オリジン化することにした。
a = [0]
a.extend( list(map(int,input().split()) )
for i in range(1,n+1): # 1 to n
if( i%3==0 ):
ans += a[i] # 1オリジンアクセス
例ではextendでやったが、先頭に[0]をinsertしても同じである。
メモリ再配置がどのみち起きるので、どちらでもよいと思う。
これによって、添え字の-1を忘れるなどのミスが消えた。
Pythonの文字列をまとめてリスト化出来てしまう高機能さが、逆に処理しにくくしていた例である。
アルゴリズムの実装では、添え字操作がメインになるので、+1や-1を繰り返していると何がなんだかわからなくなってしまう。
だったら分かるような状態を無理矢理にでも作ればよい。