洛谷 P1889 士兵站队

本文介绍了一种算法,用于计算让士兵从随机位置移动到水平队列所需的最小总步数。算法通过分别处理x轴和y轴坐标,找到各自的中位数以确定最优位置。

题目概述

    在一个划分成网格的操场上, n个士兵散乱地站在网格点上。由整数 坐标 (x,y) 表示。士兵们可以沿网格边上、下左右移动一步,但在同时刻任一网格点上只能有名士兵。按照军官的命令,们要整齐地列成个水平队列,即排成 队列,即排成 (x,y),(x+1,y), …,(x+n -1,y) 。如何选择 x 和y的值才能使 士兵们以最少的总移动步数排成一列。

解题思路

  虽然士兵的坐标分横纵,但仔细想想,其实可以分开来算。

  我们可以先排序,并求出y轴坐标的中位数。

  对于x轴,可以先假设将士兵们排在x=0,1,2…(n-1)的位置(按横坐标顺序排列),记录下每个士兵需要移动的长度,  排序,再找到它们的中位数cmid。则x轴上需要移动的总长度为Sx=|x1-cmid|+|x2-cmid+1|+…+|xn-cmid+n-1|。

  对于y轴,想要排在同一行,设该行纵坐标为p,则y轴上需要移动的总长度为Sy=|p-y1|+|p-y2|+…+|p-yn|。当p为所有x轴坐标的中位数时,总长度最小。

  最后将Sx与Sy相加,输出结果。

  时间复杂度:O(nlog n)

  空间复杂度:O(n)

源程序

var
 a,b,c,d:array[1..10002]of longint;
 i,n,t,ans,mid:longint;
procedure ms(s,m,t:longint);
 var
  f:array[1..10002]of longint;
  i,j,k,p:longint;
 begin
  i:=s;j:=m+1;k:=s-1;
  while (i<=m)and(j<=t)do
   begin
    if a[i]<a[j] then begin
                       inc(k);
                       f[k]:=a[i];
                       inc(i);
                      end
                 else begin
                       inc(k);
                       f[k]:=a[j];
                       inc(j);
                      end;
   end;
  while i<=m do begin inc(k);f[k]:=a[i];inc(i);end;
  while j<=t do begin inc(k);f[k]:=a[j];inc(j);end;
  for p:=s to t do
   a[p]:=f[p];
 end;
procedure ms2(l,r:longint);
 var
  m:longint;
 begin
  if l>=r then exit;
  m:=(l+r) div 2;
  ms2(l,m);
  ms2(m+1,r);
  ms(l,m,r);
 end;
begin
 readln(n);
 for i:=1 to n do
  readln(b[i],a[i]);
 ms2(1,n);
 ans:=0;
 mid:=a[(n div 2)+1];
 for i:=1 to n do
  ans:=ans+abs(a[i]-mid);
 a:=b;
 ms2(1,n);
 b:=a;
 for i:=1 to n do
  c[i]:=b[i]-i+1;
 a:=c;
 ms2(1,n);
 c:=a;
 mid:=c[(n div 2)+1];
 for i:=1 to n do
  ans:=ans+abs(b[i]-mid-i+1);
 write(ans);
end.

### 上海交通大学 AuTop 战队 开源算法 代码库 上海交通大学 AuTop 战队在其参与的第16届智能车竞赛中分享了其开发的算法,并提供了开源链接[^1]。该战队通过 GitHub 平台公开了他们的技术实现细节以及相关资源,以便更多研究者和技术爱好者能够学习和借鉴。 以下是关于如何访问上海交通大学 AuTop 战队开源算法的具体方法: #### 访问方式 可以通过以下链接直接进入战队的开源项目页面: - **GitHub 链接**: [https://github.com/AuTop-ShanghaiJiaoTongUniversity](https://github.com/AuTop-ShanghaiJiaoTongUniversity) 此仓库包含了他们在比赛中使用的部分核心算法、数据集处理脚本以及其他辅助工具。这些内容对于理解基于视觉的自动驾驶系统设计具有重要参考价值。 #### 主要模块概述 根据已知的信息,AuTop 战队的开源代码可能涉及以下几个方面: 1. 图像预处理:包括摄像头校正、图像增强等功能。 2. 车道线检测:利用边缘提取与霍夫变换等传统计算机视觉方法完成车道线定位。 3. 目标跟踪:采用卡尔曼滤波器或其他预测模型来追踪动态目标的位置变化情况。 4. 决策规划:综合传感器输入信息制定车辆行驶路径及速度调整策略。 此外,在另一篇博客文章中提到过使用 K 近邻 (KNN) 方法解决验证码识别问题的技术方案[^2],虽然这并非直接出自于 AuTop 战队之手,但它展示了卷积神经网络(CNNs)在模式分类任务中的强大能力,或许也能给从事类似工作的开发者带来启发。 ```python import requests def fetch_autop_repo(): url = "https://api.github.com/repos/AuTop-ShanghaiJiaoTongUniversity" response = requests.get(url) if response.status_code == 200: repo_data = response.json() print(f"Repository Name: {repo_data['name']}") print(f"Description: {repo_data['description']}") print(f"Clone URL: {repo_data['clone_url']}") else: print("Failed to retrieve repository information.") fetch_autop_repo() ``` 以上 Python 函数演示了如何借助 `requests` 库获取指定 GitHub 存储库的基本元数据。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值