排兵布阵
Description
总所周知,韩信是一位神勇的军事家。某日夜幕,敌方突然来袭,韩信作为塞外将帅吹响紧急的号角。各个帐内的士兵听见号角立即集合,站成一排,排成连续的一队。但是士兵太多了,如果让他们集合耗费太多精力就没有办法打好接下来的胜仗,因此韩信希望选择一个最优的方案使得所有士兵从帐内移动到将要站队的位置的曼哈顿距离和最小!
Input
第一行输入一个整数 n(1 ≤ n ≤ 10^5)表示士兵数量;
接下来 n 行,每行输入两个整数 xi,yi(-10^9 ≤ xi,yi ≤ 10^9)表示第 i 名士兵帐篷的坐标。
Output
请输出一个整数,表示所有士兵从帐内移动到将要站队的位置的距离和。
Hint
站成一排的意思是最终队列中士兵们的纵坐标相同,横坐标排成连续的一段区间。
曼哈顿距离:点(x1,y1)和点(x2,y2)的曼哈顿距离是|x1 - x2| + |y1 - y2|。
答案可能会超过int范围,但保证小于 2 的 64 次方,使用printf输出 64 整数请使用%lld!

代码如下:
/*
快排函数声明
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
参数
base-- 指向要排序的数组的第一个元素的指针。
nitems-- 由 base 指向的数组中元素的个数。
size-- 数组中每个元素的大小,以字节为单位。
compar-- 用来比较两个元素的函数,即函数指针(回调函数)
回调函数:
回调函数就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。 [2]
compar参数
compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void *型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。
int compar(const void *p1, const void *p2);
如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的前面;
如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定;
如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面。 [2]
功 能
使用快速排序例程进行排序。
说明
该函数不返回任何值。
头文件:stdlib.h;
qsort函数的用法说明如下:
例:qsort(a,1000,sizeof(int),comp);
其中comp函数应写为:
int comp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
上面是由小到大排序,return *(int *)b - *(int *)a; 为由大到小排序。
*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int comp(const void*a, const void*b)
{
return *(int *)a-*(int *)b; //由小到大排序
}
int main()
{
long x[100000+1]={0},y[100000+1]={0};
long m[100000+1]={0};
int n,i;
long long sum=0;
long y0,x0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%ld %ld",&x[i],&y[i]);
}
qsort(y,n,sizeof(long),comp); //将y[i]从小到大排序
y0=y[n/2]; //y0为所有y的中位数纵坐标
for(i=0;i<n;i++) //先计算|yi-y0|的和
{
sum+=fabs(y[i]-y0);
}
qsort(x,n,sizeof(long),comp); //将x[i]从小到大排序
for(i=0;i<n;i++) //x[i]-i得到一个新数组
{
m[i]=x[i]-i;
}
qsort(m,n,sizeof(long),comp);
x0=m[n/2]; //x0为新数组的中位数
for(i=0;i<n;i++) //计算x坐标部分的和
{
sum+=fabs(x[i]-i-x0);
}
printf("%lld\n",sum);
return 0;
}
该博客探讨了一种优化问题,即如何安排士兵站队使得他们从帐篷移动到指定位置的曼哈顿距离之和最小。通过输入士兵的帐篷坐标,算法寻找最佳排列方案。内容包括问题描述、输入输出格式、提示信息以及代码实现。
668

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



