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);
}
走走停停……

                
            
        
浙公网安备 33010602011771号