LoginSignup
1
0

More than 3 years have passed since last update.

AtCoder ARC099 C - Minimization

Last updated at Posted at 2020-02-29

概要

  • $[1,2,..,N]$を並び替えた数列$a$がある。(例えば$[3,2,4,1]$)
  • あるkが与えており、あなたは任意の連続したk個の数値をその区間の最小値で置き換える。
  • この数列すべてが最小の値となるのに、何回置き換えが必要か?その最小数を述べよ。

アプローチ

まず、最小の値とは題意から1であることは分かる。つまり、1を区間kずつ伝搬させていくイメージになる。例えば、以下に$N=7, k=3$の例を示す。

一番上を例にとると、図のように1を伝搬させられ、4回ですべての要素が1となる。しかし、これは最小の階数ではない。例えば、中段のように取ることで3回で目的を達成できる。

これをよく見ると、以下のことがわかる。
- なるべく重ね合わせがないようにする(すでに1にした場所を1にしても意味がない
- 順番を入れ替えて考えても問題はない(中段と下段を比較)

このため、以下のように考える、
- 左端からすべてのマスを1マスは重ねて舐める。基本的に重ねるのでk-1マスずつ塗れる
- ただし、最初の塗りは左端を重ねる必要がないので、kマス塗れる

コード

import math
n, k = map(int,input().split())
dat = list(map(int, input().split()))

i = dat.index(1) + 1 # 1 origin で i 個目に 1 がある

reached = k # 最初の1歩はkマス塗れる
# a: 残りはk-1マス塗れるので、残っている分を塗る(k<nなのでマイナスは考えない)
a = math.ceil((n - reached) / (k - 1))
print(1 + a)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0