POJ:3579-Median(二分+尺取寻找中位数)
Median
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 9201 Accepted: 3209
Description
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 the median of the differences as quickly as you can!
Note in this problem, the median is defined as the (m/2)-th smallest number if m,the amount of the differences, is even. For example, you have to find the third smallest one in the case of m = 6.
Input
The input consists of several test cases.
In each test case, N will be given in the first line. Then N numbers are given, representing X1, X2, … , XN, ( Xi ≤ 1,000,000,000 3 ≤ N ≤ 1,00,000 )
Output
For each test case, output the median in a separate line.
Sample Input
4
1 3 2 4
3
1 10 2
Sample Output
1
8
中文题意:
给N数字, X1, X2, … , XN,我们计算每对数字之间的差值:∣Xi - Xj∣ (1 ≤ i < j ≤ N). 我们能得到 C(N,2) 个差值,现在我们想得到这些差值之间的中位数。
如果一共有m个差值且m是偶数,那么我们规定中位数是第(m/2)小的差值。
输入包含多测
每个测试点中,第一行有一个NThen N 表示数字的数量。
接下来一行由N个数字:X1, X2, … , XN
( Xi ≤ 1,000,000,000 3 ≤ N ≤ 1,00,000 )
解题心得:
- 首先要知道的是n个数字可以得到C(N,2)个数字,那么要得到中位数,如果是偶数就要得到第n/2大的数字,如果是奇数就要得到第n/2+1个数字。
- 具体做法可以先将给出的数字排序,然后每次二分枚举一个中位数(O(logn)),然后验证比这个中位数小的数字有多少个,在验证比这个中位数小的数字有多少个的时候可以选择尺取法(具体实现看代码,O(n)),这样就在O(nlogn)的复杂度内完成。
#include <algorithm>
#include <stdio.h>
#include <cstring>
using namespace std;
const int maxn = 1e5+100;
int n,num[maxn];
long long tot;
void init() {
tot = 0;
tot = (long long)n*(n-1)/2;//差值的个数
if(tot%2 == 0) {//中位数在第几个
tot /=2;
}
else
tot = tot/2 + 1;
for(int i=0;i<n;i++) {
scanf("%d",&num[i]);
}
sort(num,num+n);
}
bool checke(int va) {
int t = 0;
long long sum = 0;
for(int i=0;i<n;i++) {
while(t < n && num[t] - num[i] <= va)//尺取法看比va小的值有多少个
t++;
sum += t-i-1;
}
if(sum < tot)
return true;
return false;
}
int binary_search() {//每次枚举一个中位数的值
int l,r;
l = 0, r = 1e9+100;
while(r - l > 1) {
int mid = (l + r) >> 1;
if(checke(mid))
l = mid;
else
r = mid;
}
return r;
}
int main() {
while(scanf("%d",&n ) != EOF) {
init();
int ans = binary_search();
printf("%d\n",ans);
}
return 0;
}
POJ:3579-Median(二分+尺取寻找中位数)的更多相关文章
- poj 3579 Median 二分套二分 或 二分加尺取
Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5118 Accepted: 1641 Descriptio ...
- POJ 3579 Median 二分加判断
Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12453 Accepted: 4357 Descripti ...
- POJ 3579 Median (二分)
...
- Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot 【二分 + 尺取】
任意门:http://codeforces.com/contest/1073/problem/C C. Vasya and Robot time limit per test 1 second mem ...
- hdu 6231 -- K-th Number(二分+尺取)
题目链接 Problem Description Alice are given an array A[1..N] with N numbers. Now Alice want to build an ...
- POJ 3061 Subsequence ( 二分 || 尺取法 )
题意 : 找出给定序列长度最小的子序列,子序列的和要求满足大于或者等于 S,如果存在则输出最小长度.否则输出 0(序列的元素都是大于 0 小于10000) 分析 : 有关子序列和的问题,都可以考虑采用 ...
- POJ 2566 Bound Found 尺取 难度:1
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 1651 Accepted: 544 Spec ...
- POJ:2566-Bound Found(尺取变形好题)
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5408 Accepted: 1735 Special J ...
- Subsequence (POJ - 3061)(尺取思想)
Problem A sequence of N positive integers (10 < N < 100 000), each of them less than or equal ...
随机推荐
- 零基础逆向工程40_Win32_14_枚举窗口_模拟鼠标键盘
1 查找窗口 1.1 代码案例 //查找指定窗口 TCHAR szTitle[MAX_PATH] = {0}; HWND hwnd = ::FindWindow(TEXT("#32770&q ...
- [C#]关于Distinct与重写IEqualityComparer时得知道的二三事
我们在想对一个可枚举的对象集合进行去重操作时,一般第一个想到的就是就是Linq的Distinct方法. 先定义一个类,然后使用Distinct方法去重 class Man { public int A ...
- 移动web基础
接触retina屏 基础知识(移动Web的基础知识)排版布局(高效的移动Web布局)开发效率终端交互优化 pixel像素基础viewport视图viewport_meta标签viewport_codi ...
- R语言基础命令与安装
1. R的安装过程 1.1.首先附上清华线路的下载链接Windows版3.3.1 1.2. 选择安装路径 1.3. 注意根据自己的计算机位数选择,如我的是64位,便选择64位安装. 1.4. 其他默认 ...
- Altium_Designer-PCB中各层作用详解
一直以来,对PCB中各层,比如:solder层.paste层.Top overlay层等等这些一知半解.今天仔细看了下,向大家介绍一下,有不对的地方还请指正. 1.mechanical机械层是定义整个 ...
- 使用shell脚本实现在liunx上进行svn的上传下载更新功能
最近有个功能,是需要从在liunx上拉取svn地址,并创建一个新文件进行提交,shell脚本如下 #!/bin/bash echo "Hello World !" myFile=& ...
- 2017.11.29 JSP+Servlet 中功能验证码及验证的实现
源代码如下: validate.jsp <%@ page language="java" import="java.util.*" pageEncodin ...
- Linux内存管理 - slab分配器和kmalloc
本文目的在于分析Linux内存管理机制的slab分配器.内核版本为2.6.31.1. SLAB分配器 内核需要经常分配内存,我们在内核中最常用的分配内存的方式就是kmalloc了.前面讲过的伙伴系统只 ...
- sql查询字段值长度判断是否18位
SELECT * FROM 表名 WHERE LENGTH(字段)= OR 字段为null IS NULL OR 字段为空='' SELECT * FROM 表名 WHERE LENGTH(字段)&g ...
- bootstarp v3 学习简记
1.快速设置浮动通过这两个class让页面元素左右浮动. !important被用来避免某些问题. <div class="pull-left">...</div ...