POJ3579 Median —— 二分

POJ3579 median 二分法 算法思想:    一共有n*(n-1)/2种不同的配对,一一枚举的时间复杂度为O(n^2),显然无法在1s内给出答案。在此使用二分法,先将数组排序,然后我们可以确定最大的距离为Xn-X1,那么我们只需要在0~|Xn-X1|,这些数之间寻找中位数即可。    一共需要两次二分。第一次二分,是用来寻找(猜测)可能的中位数的大小,当我们选择了一个pivot值,我们需要计算有多少组配对的距离是小于这个pi... 阅读详情

题目链接: http://poj.org/problem?id=3579


题解: n<=100000, 如果用O(n^2)的方法肯定超时的。所以要用二分搜索的方法。做法是将答案的范围二分,在每一次二分中统计有多少对元素的差值小于等于mid,如果大于等于总对数的一半,则表明当前的mid是比实际大了的或者就是答案,那么就缩小mid。如果小于总对数的一半,则说明当前mid比实际小了,那么要扩大mid。这样步步逼近。最后的就是答案了。

需要注意的是:在找有多少对元素的差值小于mid时,如果用O(n^2)的方法也是会超时的,这里处理的方法是用upper_bound(), 听说这个函数是用二分实现的。


学习:

1.lower_bound(a,a+n,d)-a,返回a[i]<d的个数。

2.upper_bound(a,a+n,d)-a,  返回a[i]<=d的个数。

3.对二分新的理解:二分除了可以直接找到目标,还可以步步逼近目标,当循环结束时,目标便浮出水面。


代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<string>
#include<set>
#define LL long long
#define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a<b?a:b)
#define INF 0x7fffffff
#define LNF ((1LL<<62)-1)
#define maxn 200010

using namespace std;

int a[100005];
int n,i,j,m,tmp;

int test(int x)
{
    int sum = 0, cnt;
    for(int i = 0; i<n; i++)
        cnt = upper_bound(a+i+1,a+n,a[i]+x)-(a+i+1), sum += cnt;

    if(sum>=tmp) return 1;
    return 0;
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(i = 0; i<n; i++)
            scanf("%d",&a[i]);

        m = n*(n-1)/2;
        tmp = (m+1)/2;
        sort(a,a+n);

        int h = 0, t = a[n-1] - a[0];
        while(h<=t)
        {
            int mid = (h+t)/2;
            if(test(mid))
                t = mid - 1;
            else
                h = mid + 1;
        }
        cout<<h<<endl;;
    }
}


FDTD Script命令学习-farfield3d/farfieldux/farfielduy 介绍了farfield3d/farfieldux/farfielduy命令功能,及不同应用语法和参数介绍,以及对官网示例进行介绍。 阅读详情

相关推荐

基于IMU的纯惯性导航轨迹绘制实践与优化

本文深入探讨了基于IMU的纯惯性导航轨迹绘制实践。通过修改开源组合导航算法KF-GINS,屏蔽GPS更新并简化地球参数,实现了仅依赖IMU数据的轨迹解算。文章详细介绍了代码改造、轨迹可视化方法,并分析了误差累积的根本原因,为深入理解惯性导航原理与传感器融合的必要性提供了宝贵的实践经验。

ff678的博客 395

POJ3579--Median

题目大意:给出一个数列,然后计算数列里各个数之间的差值的绝对值,形成一个新数列,求新数列的中位数 分析:对原始数列进行排序后,首先在这里进行第一次二分搜索,查找中位数mid,然后判断mid是否大了。判断依据如下,计算原数列在i之后,有多少个大于x[i]+mid的数的个数(原始数列里的值比x[i]+mid大,说明该值与x[i]作差形成的新数列里的数比中位数,即mid大),这里求个数就要第二

Apple.Daily的专栏 987

[SDIO] SD card 初始化及常用命令解析(附波形,uboot代码)

目录 初始化 1.cmd 0 2.cmd8 3.cmd55 4.acmd41 5.cmd2 6.cmd3 7.cmd9 8.cmd13 9.cmd7 10.ACMD51 11.CMD6 12.CMD16 13.CMD17 14.CMD18 15.CMD12 tuning CMD19 DW_SDHCI的tuning流程 初始化 1.cmd 0 /* Reset the Card */ err = mmc_go_idle(mmc...

Lenz_s_law的开发记录本 2万+

京东SP项目与校招社招技术面试全攻略

在技术招聘领域,分布式系统和高性能架构设计始终是核心考察点。以京东SP项目为例,这类专项计划特别注重候选人对系统调优和开源贡献的实战能力。从技术原理看,无论是校招中的算法与系统设计考察,还是社招强调的微服务治理经验,本质上都在验证工程师解决复杂问题的能力层级。工程实践中,采用分层架构设计(数据层/服务层/架构层)和掌握CI/CD流程已成为行业基准要求。对于求职者而言,清晰展示技术决策过程(如Redis选型依据)比单纯罗列技术栈更有价值,这也是京东等大厂在SP项目中评估候选人时的重要维度。

weixin_34337381的博客 681

Innovus ECO技巧:用setEcoMode+ecoAddRepeater实现批量buffer替换的5个关键步骤

本文详细介绍了在Cadence Innovus工具中,利用setEcoMode与ecoAddRepeater命令实现高效、批量Buffer/Inverter替换的工程化策略。通过启用批处理模式、构建可维护的替换规则、掌握高级定位技巧以及规避布线陷阱等5个关键步骤,帮助芯片设计工程师在ECO阶段大幅提升修改效率与质量,确保设计稳定签核。

d6e7f8的博客 1119

Cesium实战:从DEM数据到3D地形可视化的全流程解析

本文详细解析了从DEM数据到3D地形可视化的全流程,重点介绍了Cesium和Cesiumlab在数字高程模型(DEM)处理与地形数据转换中的应用。通过实战案例和工具对比,帮助开发者高效实现地形可视化,并分享性能优化与高级功能开发经验。

weixin_29079743的博客 336

POJ 3579 Median 二分

 POJ  3579  Median 二分 题意:给出N个数,对于存有每两个数的差值的序列求中位数,如果这个序列有偶数个元素,就取中间偏小的作为中位数。 根据高中的排列组合知识等于n*(n-1)/2,题目让我们求的是中位数,所以还要除于2; 对a进行从小到大排序; 这样从大到小开始找就可以咯! upper_bound( begin,end,num):从数组的begin位置到end-1位...

LMengi000的博客 499

有关SPSS中Fisher精确检验无法进行的解决方法(由于无法打开临时文件,因此无法进行计算)

最近在帮一个四年生完成她的毕业论文,在用SPSS进行R×C表检验的时候,发现Fisher精确检验的结果无法显示,提示为“由于无法打开临时文件,因此无法进行计算”,大概像下图一样。 (这图是从网上找的) 然...

chuyang37的博客 3万+

POJ【3579】Median(二分)

题目链接:http://poj.org/problem?id=3579 分析 这道题的题意是找到序列中两两差值的绝对值所构成的序列的中位数,我们可以二分最小的差距和最大的差距,假设其中一个差值为x,则如果大于x的差值的数量超过一半,那么x就可能是中位数或者更接近中位数。 #include<iostream> #include<cstdio> #include<algo...

yj8023xx的博客 598

NVMe与PCIe的完美结合:高速存储背后的技术解析

本文深入解析了NVMe与PCIe技术如何完美结合,实现高速存储性能的飞跃。从机械硬盘到NVMe SSD的进化历程出发,详细介绍了PCIe总线的高带宽优势与NVMe协议的低延迟设计,以及两者协同工作带来的显著性能提升。通过实测数据对比,展示了NVMe SSD在消费级和企业级应用中的卓越表现,并提供了选购与优化建议。

weixin_29216353的博客 376

保姆级教程:用Python 3.10和Ollama在Windows上搞定LightRAG本地部署(附环境配置避坑指南)

本文提供了一份详细的Windows系统下LightRAG本地部署指南,涵盖Python 3.10环境配置、Ollama模型服务安装到LightRAG核心组件部署的全流程。特别针对Windows平台常见问题提供解决方案,帮助开发者快速搭建高效的检索增强生成(RAG)系统,实现专业领域知识的智能检索与整合。

weixin_28725407的博客 489

POJ - 3579 - Median(双二分)

题目链接:http://poj.org/problem?id=3579 题意:一个数组每两个数相减取绝对值,求所有绝对值组成的数组的中数。 思路:我们称所有差值排序后的数列为a,首先如果答案是k,那么k应在a序列的m位置(m是中间的位置),排序二分答案k,我们只需要知道k与真正的答案相比是小了还是大了。我们可以算出来m,所以可以让<=k的个数cnt和m相比,如果大了说明区间应向左扩展。c...

sugarbliss 537

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

POJ 3579 Median 二分

Median Time Limit: 1000MS         Memory Limit: 65536K Total Submissions: 3699         Accepted: 1056 Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of n...

pxlsdz的博客 515

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

POJ - 3579 Median 二分 + 尺取法

传送门:POJ3579 题意:给出一个序列x,问这个序列产生的所有| xi - xj |的中位数是多少。 思路:二分答案,然后考虑每个数的贡献,关键是检查的时候如何判断每个数的贡献,可以对排序后的序列进行二分,这样总体复杂度为n(logn)^2,但是我们还有更好的方法,将序列排序后,用尺取的思想求得每一个数的贡献,总体复杂度为nlogn。 代码: #include #include #in

WA是一笔财富 549

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

POJ 3579 Median 查找中间值 二分

http://poj.org/problem?id=3579 这个题求的是一列数所有相互之间差值的序列的最中间的值是多少。看到数据可以看到用普通的n^2方法必定超时。

ChasingWaves 4149

POJ - 3579 Median 二分

题目大意:给出n个数,要求将这n个数两两相减,把这些相减得到的数排序后,输出位置在中间的那个数解题思路:如果两两相减再排序复杂度太高,肯定超时了,不妨换另一种思路 枚举最中间的那个数,然后判断一下相减得到的数有多少个大于等于枚举的数 如何判断上面所说的那句呢,其实不用把每个数相减,只需要排序一下,然后将当前这个数 + 枚举的那个数,然后在数组中找到大于等于这个数的第一个位置(lower_boun

静静地码 1575

二分——POJ 3579 Median

题目链接:http://poj.org/problem?id=3579 题意:给出N个数,求这个N个数的所有间隔中的中位数,如果有偶数个,则取中间两个中的前面那一个。 分析:因为N的取值最大为1E5,所以我们不能直接求出所有间隔来算。那么第一个想到的就是二分来做,因为间隔的取值范围我们可以得知,所以我们在这个范围内二分查找,对于每一个值,我们再通过O(n)的查找确定小于等于它的间隔数量有多少,将它与

FeBr2的博客 513

POJ - 3579 Median 二分

Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numbers: ∣Xi - Xj∣ (1 ≤ i < j ≤ N). We can get C(N,2) differences through this work, and now your task is to find th...

zamaochick的博客 187

POJ 3579 Median 二分答案

题意:给出一串序列,可以用这些序列值算出C(N,2)个|a[i]-a[j]|值,求出这些值中的中位数 思路:对每个数二分,对于每个i在序列中查找存在的大于a[i]+m的数的个数之和,即找出|a[i]-a[j]|<m的数的个数,答案即为个数恰好为C(N,2)/2时的m #include<iostream> #include<cstdio> #include<cma...

qq_42397248的博客 249

POJ3579-Median(入门二分答案)

题目链接 题意: 给定n个数字,任意两个数字都有|Xi-Xj|(差值的绝对值),这样共有C(n,2)个差值,对这些差值进行排序,要求找出这些差值的中位数,设差值个数为m,对每个差值从1~m编号,若m为偶数,则中位数编号应为m/2,反之应为(m+1)/2。 条件:Xi ≤ 1,000,000,000 3 ≤ N ≤ 1,00,000 分析: 因为根据题目条件复杂度至多为O(nlogn),然后刚开始...

flying_whale1的博客 435

POJ - 3579 :Median(二分)

原题链接 给N数字, X1, X2, … , XN,我们计算每对数字之间的差值:∣Xi - Xj∣ (1 ≤ i < j ≤ N). 我们能得到 C(N,2) 个差值,现在我们想得到这些差值之间的中位数。 如果一共有m个差值且m是偶数,那么我们规定中位数是第(m/2)小的差值。 Input 输入包含多测 每个测试点中,第一行有一个NThen N 表示数字的数量。 接下来一行由N个数字:X1, X2...

淦淦淦! 529

POJ3579 Median【二分寻找差值】

题意:有n个数组成的一个序列,对于∣Xi-Xj∣(1≤i<j≤N),这样的数总共C(N,2)个,求出值处在最中间的那个数 先将序列排成有序,之后二分之间的差值。 比如1,2,5,8,9,12 假设现在二分中当前mid=2。 对于1来说,a[i]-a[1]>=mid的有5,8,9,12 对于2来说,a[i]-a[2]>=mid的有5,8,9,12 对于5来说,...

SummerDream 339

G - Median POJ - 3579(二分)

G - Median POJ - 3579 Given N numbers, X1, X2, … , XN, let us calculate the difference of every pair of numbers: ∣Xi - Xj∣ (1 ≤ i < j ≤ N). We can get C(N,2) differences through this work, and now you...

rainbowsea_1的博客 279

poj3579 Median (二分)

给出n个数字, 对每个 取出每个 ai- aj . 问中位数是什么 这道题是二分套二分。。 先二分枚举答案, 然后二分验证 假设中位数是x ai-aj = x (j<i 原数组先排序) 那么对于每个0~n aj + x 就是 最小的 ai , 那么就可以认为 i~n 去减去aj都会比x大。 最后统计个数 题目: A - Median ...

aiezhen1717的博客 121

POJ - 3579-Median(二分套娃)

题目链接 题意: 给你个数组,求这些数组所有数字之差的绝对值的中位数。 数据范围: Xi ≤ 1,000,000,000 3 ≤ N ≤ 1,00,000 思路: 数据很大,所以我们不能暴力hhh,这里要用到一个二分,首先将数组从小到大排序,这个中位数肯定在1到a[n]之间,所以我们首先在1~a[n]之间进行二分查找,那么我们如何判断区间左移还是右移呢?首先我们用小学知识可以计算出差值一共有n*(n-1)/2个,所以如果我们让原数组中的每个数都加上这个中位数,再和其他数相比较,比他大或比他小的数在所有数中应

ACkingdom的博客 291
上一篇: Codeforces Round #398 (Div. 2) D. Cartons of milk —— 二分
下一篇: 2017广东工业大学程序设计竞赛 E倒水(Water)
DOLFAMINGO
博客等级 码龄10年 8粉丝 216原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值