頭良くなりたい人

文系大学生shadeのブログです。競技プログラミングや人文学の話題,受験ネタなど。

ABC101 C - Minimization

問題はこちら atcoder.jp

方針

数列 A_1,A_2,...,A_N1,2,...,N を並び替えたものなので,題意の操作の結果は,1,1,...,1 となるほかありません。

このとき,置き換えられるべき要素は 1 以外の N-1 個であり,1回の操作で最大 K-1 個の要素を置き換えることができます。

つまり,求める操作回数は,\lceil (N-1)/(K-1) \rceil(N-1)/(K-1) 以上で最小の整数)です。

操作は 1 を含む部分から始めればよく,操作回数は数列の並びによらず一定なので,実は A_1,A_2,...,A_N を受け取る必要もありません。

(簡単すぎて嘘解法かと疑いましたが,解説PDFでも同様の解法が紹介されていました。こちらには証明もついています。)

コード

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n,k;
    cin>>n>>k;

    cout<<ceil((double)(n-1)/(k-1))<<endl;
}