题意:给你一个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));
}