题意:给你一个1*n(n偶数)的棋盘,给你n/2个棋子下标,让你把所有棋子全放到奇数位置或全放到偶数位置,棋子平移到相邻位置花费为一,求最小花费。
思路:只可能放到奇数位或偶数位,且一一对应,先排序,分别算两种情况对应位置与排好序的初始下标相减的绝对值之和即为两种情况的最优解,再取min(奇数位花费,偶数位花费)即为答案。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
const int maxn = 105;
int main()
{
int n, a[maxn], odd = 0, even = 0;
scanf("%d", &n);
for (int i = 1; i <= n/2; i ++) {
scanf("%d", &a[i]);
}
sort(a+1, a+n/2+1);
for (int i = 1, temp = 1; i <= n/2; i ++, temp += 2) {
odd += abs(a[i] - temp);
even += abs(a[i] - temp - 1);
}
printf("%d\n", min(odd, even));
}
探讨了在1*n大小的特殊棋盘上,如何通过最少步骤将棋子全部移至相同颜色格子的问题。文章提供了算法思路及C++实现代码。
.
(
in 4 moves, then
in 3 moves,
in 2 moves and
in 1 move.

255

被折叠的 条评论
为什么被折叠?



