(程序设计方法与实践)排兵布阵

该博客探讨了一种优化问题,即如何安排士兵站队使得他们从帐篷移动到指定位置的曼哈顿距离之和最小。通过输入士兵的帐篷坐标,算法寻找最佳排列方案。内容包括问题描述、输入输出格式、提示信息以及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排兵布阵

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值