1 条题解

  • 0
    @ 2023-2-20 11:57:10

    `

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <vector>
    #include <utility>
    #include <cmath>
    #include <iomanip>
    #include <string>
    #include <cstring>
    #include <unordered_set>
    #include <unordered_map>
    #include <map>
    #include <queue>
    #include <set>
    const int maxn = 10010;
    using namespace std;
    
    int n, m;
    int a[100010];
    bool check(int val)     //判断>=差值val的个数是否大于一半
    {
    	int cnt = 0, k = 0;
    	for (int i = 0; i < n; i++)
    	{
    		while (k < n && a[k] - a[i] < val)
    		{
    			k++;
    		}
    		cnt += n - k;
    	}
    	return cnt > m;
    }
    int main() {
    	cin >> n;
    	m = n * (n - 1) / 4;            //差值的个数 C(n,2)
    	for (int i = 0; i < n; i++)
    	{
    		cin >> a[i];
    	}
    	sort(a, a + n);
    	int l = 0, r = a[n - 1] - a[0], mid;         //r为最大差值
    	while (l <= r)
    	{
    		mid = l + (r - l) / 2;
    		if (check(mid))          // 大于一半往右找
    			l = mid + 1;
    		else                     // 否则往左找
    			r = mid - 1;
    	}
    	int ans = l - 1;                // 跳出while时 , l = r + 1;
    	cout << ans << endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    13
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    15
    已通过
    8
    上传者