AcWing 123. 士兵
纸牌均分问题
此题与七夕祭和货舱选址相似,所以在此不对纸牌均分问题做解释了。
只是有一个小小的注意点:
-
因为y最后会变为相同值,并要求移动次数最小,那么只需要记录每一个士兵的y坐标值,然后即可转换为货舱选址问题。
-
但因为x是不一样的,并且最后是有序连接排列的,所以我们用一个小技巧:用货舱选址的方法带入,使得\(x_1=x_2=...=x_n\),最后把\(x_i+i\),这样的话就变成\(x_j=k+1,2,3,4,5,6...\)的排列。然而在移动i个单位的时候会使操作次数复杂,那么我们可以先预处理\(x_i-i\),最后得出的操作数就是最小的。
AC code
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 100010;
int n;
int x[N], y[N];
int get(int a[])
{
sort(a, a + n);
int x = a[n - 1 >> 1], res = 0;
for(int i = 0; i < n; i ++ )
res += abs(a[i] - x);
return res;
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
cin >> n;
for(int i = 0; i < n; i ++ ) cin >> x[i] >> y[i];
sort(x, x + n);
for(int i = 0; i < n; i ++ ) x[i] -= i;
cout << get(y) + get(x);
}
本文来自博客园,作者:{三季野花},转载请注明原文链接:https://www.cnblogs.com/SanGarden/articles/17068424.html