由作业士兵排队问题引出的

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

请计算使所有士兵排成一行需要的最少移动步数。

这是一个课后题,通过推算可以得知该问题可以转化为一个求解中位数的问题。

但在这里先不进行整个问题的求解,因为他的关键也是在于分治算法求解中位数

中位数的求法一般来说是这样的:

通过使用各种排序手段,然后得到最中间脚标对应的数,即是中位数。

但其实并没有必要进行排序,因为我们只要求第k大的数,参考快速排序第一部分的分解,可以进行一下求解:

代码如下:

#include <bits/stdc++.h>

using namespace std;
int N;
const int maxn = 1000;
//int a[maxn];
int b[maxn]; int partitions(int *a, int l, int h)
{
//record the lwest part of array a
int tmp = a[l]; while(l < h)
{
//hgh first
while(h > l && a[h] >= tmp){
h--;
}
a[l] = a[h];
while(l < h && a[l] <= tmp){
l++;
}
a[h] = a[l];
}
a[l] = tmp;
return l;
} int findM1(int a[], int k, int l, int h) {
int j = partitions(a, l, h); if (j == k) {
return a[k];
} else if (j > k) {
return findM1(a, k, l, j - 1);
} else {
return findM1(a, k, j + 1, h);
}
} int findM2(int a[], int k , int n)
{
int l = 0;
int h = n-1;
while(l < h)
{
int j = partitions(a,l,h);
if(j == k)
{
return a[k];
}
else if(j < k)
{
h = j-1;
}
else
{
l = j+1;
}
}
return a[k];
} int main()
{
int a[10] = {2,1,3,4,7,9,8,10,5,11}; cout << findM1(a,3,0,9) << endl;
cout << findM2(a,3,10) << endl; return 0;
}

有一些细节需要注意,可以查一下士兵排队问题,然后通过以上算法进行求解。

算法准备-分治算法解决第k位数的线性查找的更多相关文章

  1. 十依据一个有用的算法来找到最小(最大)的k的数量-线性搜索算法

    例如:进入1.2.3,4,5,6.7.8此8数字,最小的4图的1,2,3,4. 思路1:最easy想到的方法:先对这个序列从小到大排序.然后输出前面的最小的k个数就可以.假设选择高速排序法来进行排序, ...

  2. 从两个平方算法到分治算法-java

    先来看看问题的来源,假设有这么一个数组: 1 2 -5 4 -2 3 -3 4 -15 我们要求出其中连续字数组的和的最大值 例如这么可以很明显看出 4+ –2 + 3 + –3 + 4 = 6 所有 ...

  3. 算法leetcode_分治算法

    一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子 ...

  4. 算法导论(第三版)Exercises2.1(插入排序、线性查找、N位大数相加)

    关于练习程序的说明参见置顶的那篇. 2.1-1: 31 41 59 26 41 58 31 41 59 26 41 58 31 41 59 26 41 58 26 31 41 59 41 58 26 ...

  5. Python 查找算法_众里寻他千百度,蓦然回首那人却在灯火阑珊处(线性、二分,分块、插值查找算法)

    查找算法是用来检索序列数据(群体)中是否存在给定的数据(关键字),常用查找算法有: 线性查找: 线性查找也称为顺序查找,用于在无序数列中查找. 二分查找: 二分查找也称为折半查找,其算法用于有序数列. ...

  6. Python 一网打尽<排序算法>之从希尔排序算法的分治哲学开始

    1. 前言 本文将介绍希尔排序.归并排序.基数排序(桶排序).堆排序. 在所有的排序算法中,冒泡.插入.选择属于相类似的排序算法,这类算法的共同点:通过不停地比较,再使用交换逻辑重新确定数据的位置. ...

  7. NOI题库分治算法刷题记录

    今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...

  8. 剑指Offer——分治算法

    剑指Offer--分治算法 基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更 ...

  9. 分治算法——Karastsuba算法

    分治(Divide and Conquer)算法:问题能够分解为子问题,每一个问题是能够独立的解决的,从子问题的解能够构建原问题. Divide:中间分.随机分.奇偶分等,将问题分解成独立的子问题 C ...

随机推荐

  1. c# Winform间的页面传值

    Form2 public partial class Form2 : Form { public string str; public Form2() { InitializeComponent(); ...

  2. postgresql----数据库表约束----NOT NULL,DEFAULT,CHECK

    数据库表有NOT NULL,DEFAULT,CHECK,UNIQUE,PRIMARY KEY,FOREIGN KEY六种约束. 一.NOT NULL ---- 非空约束 NULL表示没有数据,不表示具 ...

  3. class表与student表之间的关系

    1.班级表 2.学生表 3.student(学生表),Score(成绩表),course(课程表)  4.三张表联合查询     5.连接连个结果集(两个集合必须有相同的列数,列具有相同的数据类型,最 ...

  4. Oracle之catalog恢复目录的创建于维护(51CTO风哥rman课程)

    catalog恢复目录配置过程 1,创建一个表空间 2,创建rman用户并授权 3,创建恢复目录 4,配置TNS 5,注册数据库 6,检查 创建ramn表空间 首先查看一下其他表空间位置 create ...

  5. Eclipse For Android 代码自动提示功能

    Eclipse for android 实现代码自动提示智能提示功能,介绍 Eclipse for android 编辑器中实现两种主要文件 java 与 xml 代码自动提示功能,解决 eclips ...

  6. vue - vue

    一.vue - 介绍 vue的作者叫尤雨溪,中国人.自认为很牛逼的人物,也是我的崇拜之神. 关于他本人的认知,希望大家读一下这篇关于他的文章,或许你会对语言,技术,产生浓厚的兴趣.https://mp ...

  7. Python开发【模块】:PyMySQL

    PyMySQL 1.安装 [root@localhost ~]# pip install PyMySQL 2.初识 创建数据表结构: mysql> CREATE TABLE `users` ( ...

  8. Python开发【模块】:sqlalchemy

    一.对象映射关系(ORM) orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却 ...

  9. postman:模拟发送一个需要cookie认证的请求

    1.chrome 已安装插件intercept. 由于chrome安全的限制,发不出带cookie的请求.如果想要发送带cookie的请求,需要开启Interceptor. 2.chrome 浏览器要 ...

  10. PAT 1143 Lowest Common Ancestor[难][BST性质]

    1143 Lowest Common Ancestor(30 分) The lowest common ancestor (LCA) of two nodes U and V in a tree is ...