【快速选择算法与nth_element函数】【续UVA11300 】
在白书中提到了一种O(n)级别的寻找中位数算法 就是我们今天要介绍的主角
快速选择算法
类似快排 选择一个比较元素 进行递归处理寻找第k大元素
假设最后比较元素到了i
以下描述是我写快排的常用字符 所以外人应该看不懂。。。。
如果(i-s+1)<k 去(i+1,t)的区间 递归寻找第(k-(i-s+1)) 大的数
如果(i-s+1)=k 返还i的值即可
如果 (i-s+1)>k 去 (s,i-1)的区间 递归找第k大的数
类似快排的思想 很容易理解
代码如下:
int swap(long long &a,long long &b) {long long temp=a;a=b;b=temp;return 0;}
int quickchoice(long long *A,int s,int t,int k)
{
int i=s,j=t;
long long x=A[s];
while(i<j)
{
while(i<j&&A[j]>=x) j--;
if(i<j) swap(A[i],A[j]),i++;
while(i<j&&A[i]<x) i++;
if(i<j) swap(A[j],A[i]),j--;
}
A[i]=x;
if((i-s+1)==k) return 0;
else if((i-s+1)<k&&i+1<=t) quickchoice(A,i+1,t,k-(i-s+1));
else if((i-s+1)>k&&s<=i-1) quickchoice(A,s,i-1,k);
return 0;
}
UVA11300快速选择算法实现如下:
#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std;
long long gold[1000100],M;
int cmp(const void *i,const void *j)
{
if(*(long long *)i>*(long long *)j) return 1;
else if(* (long long *)i==*(long long *)j) return 0;
else return -1;
}
int main()
{
int n,k;
long long sum;
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&gold[i]);
sum+=gold[i];
}
M=sum/n;
for(int i=1;i<=n-1;i++)
gold[i]=gold[i-1]+M-gold[i];
gold[n]=0;
qsort(gold+1,n,sizeof(gold[1]),cmp);
k=(n+1)/2;
sum=0;
for(int i=1;i<=n;i++)
sum=sum+abs(gold[i]-gold[k]);
printf("%lld\n",sum);
}
return 0;
}
上面这个方法不知道为何 速度和快排没什么区别。。
但是下面这个就快了一倍
nth_element函数 非常奇怪
好吧 觉得奇怪 是被网上各种奇葩的资料误导了
自己亲手操作后还是懂了
nth_element(begin,kth,end)
在[begin,end)这段区间内找第k大的数 其实这样描述是不精确的
这样描述似乎更合适
比如 nth_element(s+1,s+k,s+n+1)
在[1,n+1)这段区间内 s[k] 左边的全部小于等于他 右边的全部大于等于他
如果 区间从1开始 似乎确实可以描述成 第k个
如果不从1开始就注意点
AC代码如下:
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
long long gold[1000100],M;
int n;
int main()
{
int k;
long long sum;
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&gold[i]);
sum+=gold[i];
}
M=sum/n;
for(int i=1;i<=n-1;i++)
gold[i]=gold[i-1]+M-gold[i];
gold[n]=0;
k=(n+1)/2;
nth_element(gold+1,gold+k,gold+1+n);
for(int i=1;i<=n;i++)
printf("gold:%d\n",gold[i]);
sum=0;
for(int i=1;i<=n;i++)
sum=sum+abs(gold[i]-gold[k]);
printf("%lld\n",sum);
}
return 0;
}
【快速选择算法与nth_element函数】【续UVA11300 】的更多相关文章
- 选取第K大数的快速选择算法和注意事项
快速选择算法,是一种能在大致O(N)的时间内选取数组中第k大或者k小的算法.其基本思路与快速排序算法类似,也是分治的思想. 其实这个算法是个基础算法,但是不常用,所以今天编的时候错了POJ2388,才 ...
- POJ 2388 Who's in the Middle (快速选择算法:O(N)求数列第K大)
[题意]求数列中间项. ---这里可以扩展到数列第K项. 第一次做的时候直接排序水过了= =--这一次回头来学O(N)的快速选择算法. 快速选择算法基于快速排序的过程,每个阶段我们选择一个数为基准,并 ...
- 求一无序数组中第n大的数字 - 快速选择算法
逛别人博客的时候,偶然看到这一算法题,顺便用C++实现了一下. 最朴素的解法就是先对数组进行排序,返回第n个数即可.. 下面代码中用的是快速选择算法(不晓得这名字对不对) #include <v ...
- nth_element函数
使用方法:nth_element(start, start+n, end) 使第n大元素处于第n位置(从0开始,其位置是下标为n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都 ...
- Java实现 蓝桥杯VIP 算法训练 sign函数
试题 算法训练 sign函数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定实数x,输出sign(x)的值. sign(x)是符号函数,如果x>0,则返回1:如果x=0, ...
- Java实现蓝桥杯VIP算法训练 二元函数
试题 算法训练 二元函数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 令二元函数f(x,y)=ax+by,a和b为整数,求一个表达式S的值. 只有满足以下要求的表达式才是合法的: ...
- KMP算法中next函数的理解
首先要感谢http://blog.csdn.net/v_july_v/article/details/7041827以及http://blog.chinaunix.net/uid-27164517-i ...
- C++ STL算法系列6---copy函数
现在我们来看看变易算法.所谓变易算法(Mutating algorithms)就是一组能够修改容器元素数据的模板函数,可进行序列数据的复制,变换等. 我们现在来看看第一个变易算法:元素复制算法copy ...
- C++ STL算法系列1---count函数
一.count函数 algorithm头文件定义了一个count的函数,其功能类似于find.这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果. 编写程序读取一系列int型数据,并将 ...
随机推荐
- Vlc for Android 全面阐述
简单介绍 Vlc for android是一款开源安卓播放器.具备播放多媒体文件.光盘.设备以及网络流媒体协议等功能,支持ARMv7 CPU或一个x86 CPU的设备,全部播放控制特性都已经开发完整. ...
- [转]Laravel 4之验证
Laravel 4之验证 http://dingjiannan.com/2013/laravel-validation/ 基本验证 使用Validator::make($data, $rules)验证 ...
- BOOST 线程完全攻略 - 扩展 - 可被关闭的线程类
本文假设读者已经基本了解boost线程库的使用方法. boost是个开源工程,线程这一块也在不断完善之中,到现在这个阶段,boost::thread仅仅实现了一个完美的技术框架,但是读者在实际使用中会 ...
- Oracle-nomount/mount/open
通常所说的Oracle Server主要由两个部分组成:Instance和Database.Instance是指一组后台进程(在Windows上是一组线程)和一块共享内存区域:Database是指存储 ...
- 关于jQuery获取checkbox状态的问题
这位大神概括的很好 http://www.cnblogs.com/wangkongming/p/4002710.html
- HTML - Textarea - 空格的问题解决方式
第一种方式: <textarea name="textareaname" rows="XX" cols="XX" ></t ...
- React react-ui-tree的使用
公司需要做一个IDE,要做IDE当然少不了文件列表了.下面我就来展示一下刚刚研究的一个库. 下面是链接:https://react.rocks/example/react-ui-tree 至于如何导入 ...
- Biztalk2010安装及配置问题集
在安装Biztalk2010时,碰到很多问题,有的是粗心有的也是比较bt的,如: 1)在win7 64下引入x86 的cab,有点粗心,幸亏给我报错版本不兼容(呵呵): 2)安装的时候 不知道为什么计 ...
- codeforces 519E A and B and Lecture Rooms(LCA,倍增)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud E. A and B and Lecture Rooms A and B are ...
- CDZSC_2015寒假新人(2)——数学 G
G - G Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...