当前位置: 首页 > 工具软件 > shashlik > 使用案例 >

Shashlik Cooking(思维)

洪宇定
2023-12-01

题目链接: Shashlik Cooking


大致题意:

给你一个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


AC代码:

#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;
}

END

 类似资料: