POJ1723 LuoguP1889 SOLDIERS 士兵站队
这道题洛谷评分这么低我是没想到的。感觉这是目前我做得最巧妙的橙题了。
先简述一下题目:
平面内有随机分布的
我们一步一步来解决这道题。
首先,我们把我们要描述的对象数学化。不妨设最终这
所以我们把纵向运动分离出来,用序列
- 有一个序列
。求 。
这个问题不就是货仓选址(AcWing104)嘛!参考蓝书:

也有另一种证明,适合实数域,也更优美:(先把
即求下式的最小值:
利用绝对值三角不等式
当
现在我们来解决横向移动。这个麻烦很多。我们设一个大小为
即,若点
那么最终横向的移动距离为:
显然因为
这里我们采用邻项交换的思想。如果我们交换
比较
如图是当
现在问题转化为了:当
我们发现,
现在
它现在就变成了纵向移动的公式!现在会求了吧!就是要求:
找序列
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
int n,x[10055],y[10055],ans;
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d",x+i,y+i);
sort(x+1,x+1+n);
//求得确切的序列 A
for(int i=1;i<=n;i++)x[i]-=i;
//现在 x 数组描述的就是序列 B
sort(x+1,x+1+n);sort(y+1,y+1+n);
for(int i=1;i<=n;i++)
ans+=abs(x[i]-x[(n>>1)+1])+abs(y[i]-y[(n>>1)+1]);
printf("%d",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律