依据题意可知,在这样一个全排列中,最终所有的数字都会变成1.题目要求我们找的是在满足题意条件下执行最少的次数,而没有问我们如何执行所以我们不妨假设我们每次执行的都是最优的,这应当有在大于k-1个数字不为1的条件下,每次使k-1个数字为1,在有小于k-1个数字不为1的情况下使剩下的数字为1.
代码如下:
#include<iostream> using namespace std; const int maxn = 1e5 + 10; int a[maxn]; int main() { int n, k; cin >> n >> k; for (int i = 1;i <= n;i++) cin >> a[i]; int t = (n - 1) / (k - 1); int m = (n - 1) % (k - 1); if (m > 0) m = 1; cout << t + m << endl; return 0; }
虽然我的代码比较短,但我的思路绝对是清晰的,我想这也是解决此题的最优解。