题目将n个数的某一种排列,经过若干次操作,变成同一个数。
想要使操作数最少,那么第一次操作k个数,然后从第二次起操作额外的(k-1)个数和一个已经被操作过的数就可以了。
实际操作次数跟数组里面的排列是怎么样的并没有关系,所以只是输入就好了。
详细看代码。

#include <bits/stdc++.h>
using namespace std;
int a[100100];
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    if(n==k)//如果n和k相等,那么仅需要一次操作,就可以把序列中所有数变成相等的
    {
        printf("1\n");
        return 0;
    }
    else//当k<n的时候
    {
        if((n-k)%(k-1)==0)//第一次操作了k个数,剩下次数每次操作k-1个数刚刚能够操作完
        {
            printf("%d\n",(n-k)/(k-1)+1);//+1是补上第一次操作的计数
            return 0;
        }
        else//第一次操作k个数,剩下次数每次操作k-1个数,最后一次不足k-1个数了
        {
            printf("%d\n",(n-k)/(k-1)+2);//+1是补上第一次操作计数,还有+1补上最后一次
            return 0;
        }
    }
}