poj3579 双重二分,有意思的一道题,注意二分边界
2016-03-06 11:08
330 查看
Median
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 m#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[100005];
int n,num;
int bin(int x){
//cout<<"x:"<<x<<endl;
int l=0,r=n-1,mid;
while(l<r){
mid=(l+r)/2;
if (a[mid]<=x){
l=mid+1;
}
else r=mid;
}
//cout<<"bin:"<<n-1-r+1<<endl;
return n-1-r+1;
}
int pan(int guess){
//cout<<"guess:"<<guess<<endl;
int count=0;
for (int i=0;i<n;i++){
if (a[i]+guess>=a[n-1]) break;
count+=bin(a[i]+guess);
if (count>num) return -1;
}
if (count<=num) return 0;
}
int main(){
while(scanf("%d",&n)!=EOF){
num=(n)*(n-1)/2;
num/=2;
for (int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
4000
int r=a[n-1]-a[0];
int l=0,mid;
int flag;
while(l<r){
mid=(l+r)/2;
flag=pan(mid);
if (flag==0){
r=mid;
}
else if (flag==-1) l=mid+1;
}
printf("%d\n",l);
}
}
edian in a separate line.
Sample Input
Sample Output
排序之后,从0 到 最大差值进行二分搜索,判断guess值是否满足大于a[i]+guess的一共有count个,这里计数用到了第二次二分,找到上界,返回末尾与它的下标2差,如果没有那么多,说明guess值猜大了,有的话还是要继续猜,因为不能保证当前guess值是在原数组中出现过的,
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5246 | Accepted: 1686 |
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 m#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[100005];
int n,num;
int bin(int x){
//cout<<"x:"<<x<<endl;
int l=0,r=n-1,mid;
while(l<r){
mid=(l+r)/2;
if (a[mid]<=x){
l=mid+1;
}
else r=mid;
}
//cout<<"bin:"<<n-1-r+1<<endl;
return n-1-r+1;
}
int pan(int guess){
//cout<<"guess:"<<guess<<endl;
int count=0;
for (int i=0;i<n;i++){
if (a[i]+guess>=a[n-1]) break;
count+=bin(a[i]+guess);
if (count>num) return -1;
}
if (count<=num) return 0;
}
int main(){
while(scanf("%d",&n)!=EOF){
num=(n)*(n-1)/2;
num/=2;
for (int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
4000
int r=a[n-1]-a[0];
int l=0,mid;
int flag;
while(l<r){
mid=(l+r)/2;
flag=pan(mid);
if (flag==0){
r=mid;
}
else if (flag==-1) l=mid+1;
}
printf("%d\n",l);
}
}
edian in a separate line.
Sample Input
4 1 3 2 4 3 1 10 2
Sample Output
1 8
排序之后,从0 到 最大差值进行二分搜索,判断guess值是否满足大于a[i]+guess的一共有count个,这里计数用到了第二次二分,找到上界,返回末尾与它的下标2差,如果没有那么多,说明guess值猜大了,有的话还是要继续猜,因为不能保证当前guess值是在原数组中出现过的,
相关文章推荐
- C++二分查找在搜索引擎多文档求交的应用分析
- C语言编程中实现二分查找的简单入门实例
- C#二分查找算法实例分析
- 在MySQL中实现二分查找的详细教程
- Java实现二分查找算法实例分析
- Python二分查找详解
- 简介二分查找算法与相关的Python实现示例
- 漫谈递归:二分查找算法的递归实现
- 二分查找
- [LeetCode] Find Minimum in Rotated Sorted Array
- 折半查找法
- "二分查找(Binary Search)"与"斐波那契查找(Fibonacci Search)"
- 二分查找
- C#版二分查找(代碼)
- 4495: Least Prime factor 找到最小质因子P的第N小正整数
- 使用Java完成《算法导论》习题2.3-5
- 使用Java完成《算法导论》习题2.3-6
- 使用Java完成《算法导论》习题2.3-7
- Sort Colors,Search in Rotated Sorted Array I,II,Merge Intervals,Insert Interval,Subsets II
- Find Peak Element,Longest Substring Without Repeating Characters