bzoj3969 [WF2013]Low Power

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3969

【题解】

二分答案x,贪心选取,如果选取了i个,有j对,那么要满足i<=2*j*k(不然有数就没位置放了)

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 2e6 + 10;
const int mod = 1e9+7;

# define RG register
# define ST static

int n, k, N; 
int a[M]; 

inline bool chk(int x) { 
    int times = 0;
    for (int i=1; i<=N; ++i) { 
        if(i-1 > 2*times*k) return false; 
        if(i <= N && a[i+1] - a[i] <= x) ++i, ++times; 
        if(times == n) return 1; 
    }
    return false;
}
         
int main() {
    cin >> n >> k; N = 2*n*k;
    for (int i=1; i<=N; ++i) scanf("%d", a+i);
    sort(a+1, a+N+1);
    int l = a[2] - a[1], r = 1e9, ans;
    while(1) {
        if(r-l <= 3) {
            for (int i=l; i<=r; ++i) {
                if(chk(i)) {
                    ans = i;
                    break;
                }
            }
            break;
        }
        int mid = l+r>>1;
        if(chk(mid)) r = mid;
        else l = mid;
    }
    cout << ans << endl; 
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/galaxies/p/bzoj3969.html