• cdoj1087 基爷的中位数 二分


    题目链接:

    http://acm.uestc.edu.cn/#/problem/show/1087

    题意:

    题解:

    二分枚举中位数,然后:mid为当前的中位数,找到比a[i]大mid的数(>=a[i]+mid)的个数,判断cnt是不是有总数的一半

    代码:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define MS(a) memset(a,0,sizeof(a))
     5 #define MP make_pair
     6 #define PB push_back
     7 const int INF = 0x3f3f3f3f;
     8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
     9 inline ll read(){
    10     ll x=0,f=1;char ch=getchar();
    11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 //////////////////////////////////////////////////////////////////////////
    16 const int maxn = 1e5+10;
    17 
    18 ll a[maxn];
    19 
    20 int main(){
    21     ll n;
    22     while(cin >> n){
    23         for(int i=0; i<n; i++)
    24             a[i] = read();
    25 
    26         ll tmp = n*(n-1)/2;
    27         sort(a,a+n);
    28         ll l=0,r=INFLL,cnt=0,ans=0;
    29         while(l<=r){
    30             ll mid = (l+r)/2;
    31             cnt = 0;
    32             for(int i=0; i<n; i++){
    33                 cnt += a+n-lower_bound(a+i+1,a+n,a[i]+mid); // mid为当前的中位数,找到比a[i]大mid的数(>=a[i]+mid)的个数,判断cnt是不是有总数的一半
    34             }
    35             if(cnt <= tmp/2) // 并不知道为什么等于,对于第一个样例,M个数是1 1 1 2 2 3  按照题目的要求,中位数是1
    36                             // 我猜 是当M是偶数的时候,中位数mid可能重复,所以要再往下找一个
    37                 r = mid-1;
    38             else
    39                 ans = mid, l = mid+1;
    40         }
    41         cout << ans << endl;
    42     }
    43 
    44     return 0;
    45 }
  • 相关阅读:
    开启 clr enabled
    索引查看
    nginx 安装
    mysql中int(10)与int(11)有什么区别吗?
    1.安卓开发基础1~6笔记
    Vue项目搭建基础之Vue-cli模版测试
    alert执行顺序
    介绍call和apply
    a链接易混淆与form表单简易验证用法详解
    js正则知识点
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827633.html
Copyright © 2020-2023  润新知