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);
}
posted @ 2023-01-27 00:01  Sankano  阅读(6)  评论(0编辑  收藏  举报