牛客算法周周练5 C 序列最小化
题目大意
给定 1 ~ n 的一个排列, 每次选择序列中 k 个连续的数字,全部替换为其中最小的数. 询问最少的次数.
分析
应该不难想到, 最终, 序列中的每一个数都将变为 1. 那么就从 1 的位置开始, 连续选 k 个数, 变为 1 即可.
不过, 操作完后, 会发现, 其实从序列一端开始选即可, 每次和上次 k 个数中最后一个数开始即可.
代码
#include <cstdio>
#include <cstring>
using namespace std;
const int SIZE = 1e5 + 5;
int arr[SIZE];
int main()
{
    int n, k;
    int ans;
    scanf("%d %d", &n, &k);
    for (register int i = 1; i <= n; i++)
        scanf("%d", &arr[i]);
    ans = 0;
    if (n <= k)
        ans = 1;
    else
    {
        n -= k;
        ans++;
        k--;
        ans += n / k;
        if (n % k != 0)
            ans++;
    }
    printf("%d\n", ans);
    return 0;
}
京公网安备 11010502036488号