给你一个n代表有n个初始状态为正面的羊肉串,k代表你每次可以随机选择一个数值i,把第 i-k 到第 i+k 个羊肉串翻过来
问你最少需要多少次可以把所有羊肉串全部翻过来。
三种情况:
1.k=0
肯定是翻n次
2.n<=(2*k+1)
翻n/2+1的位置一次
3.n>(2*k+1)
①n % (2 * k + 1) > k || !(n % (2 * k + 1))
从k+1开始翻,每次翻隔2*k+1
②n % (2 * k + 1) <= k&& n % (2 * k + 1)!=0
从1开始翻,每次翻隔2*k+1
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4;
int n, k, cnt;
int a[N];
int main() {
cin >> n >> k;
if (!k) {
cnt = n;
for (int i = 1; i <= n; ++i)a[i] = i;
}
else if (n <= 2 * k + 1) {
cnt = 1;
a[1] = n / 2 + 1;
}
else if (n > 2 * k + 1) {
if (n % (2 * k + 1) > k || !(n % (2 * k + 1))) {
cnt = 0;
for (int i = k + 1; i <= n; i += (2 * k + 1))a[++cnt] = i;
}
else {
cnt = 0;
for (int i = 1; i <= n; i += (2 * k + 1))a[++cnt] = i;
}
}
cout << cnt << endl;
for (int i = 1; i <= cnt; ++i)cout << a[i] << ' ';
return 0;
}