题目将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; } } }