国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

POJ 3579 Median(2次二分)

2019-11-10 19:46:55
字體:
來源:轉載
供稿:網友

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 ifm,the amount of the differences, is even. For example, you have to find the third smallest one in the case ofm = 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, representingX1, 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
41 3 2 431 10 2Sample Output
18

  思路:本題直接使用暴力法,時間復雜度約為n^2,超時,所以采用二分法。

  先把差值分出來,再用二分法驗證差值是否符合要求。

#include<algorithm>#include<cstdio>#include<cstdlib>using namespace std;int n,m;int str[100005];int judge(int mid){   int cnt=0;    for(int i=0;i<n;i++)    {        cnt+=n-(lower_bound(str,str+n,str[i]+mid)-str);//C++中STL的查找函數
    }    return cnt>m?1:0;}int main(){   //freopen("e://in.txt","r",stdin);    while(scanf("%d",&n)==1)    {     m=n*(n-1)/4;         for(int i=0;i<n;i++)          scanf("%d",&str[i]);          sort(str,str+n);          int left=0,right=str[n-1]+str[0],mid;          while(left<=right)          {              mid=(left+right)/2;              if(judge(mid))                left=mid+1;              else                right=mid-1;          }          printf("%d/n",left-1);    }    return 0;}

總結:lower_bound函數的引用

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿巴嘎旗| 平阴县| 南涧| 镇雄县| 安岳县| 西乌| 阿城市| 张家口市| 西乌珠穆沁旗| 陇川县| 康乐县| 密山市| 五原县| 梧州市| 积石山| 桑植县| 久治县| 牙克石市| 乐山市| 台东市| 四子王旗| 保德县| 彩票| 霍城县| 抚州市| 牡丹江市| 鄂尔多斯市| 施甸县| 沂源县| 大名县| 灌阳县| 康平县| 芜湖县| 青海省| 宜章县| 社旗县| 平山县| 黄山市| 花莲市| 浏阳市| 筠连县|