POJ-3579

来源:互联网 发布:考研网络班 编辑:程序博客网 时间:2024/06/05 05:11

这题可用二分解,暴力的O(n^2)肯定是必挂的,对可能的结果值做二分,然后check这个值是否符合条件

#include<cstdio>#include<algorithm>using namespace std;namespace{typedef long long ll;int N, dat[100000];ll K;bool check(int num){ll count = 0;for (int i = 0; i < N; i++){int index = upper_bound(dat, dat + N, dat[i] + num) - dat;count += index - i - 1;}return count >= K;}void solve(){sort(dat, dat + N);ll total = 1LL * N * (N - 1) / 2;K = total & 1 ? total / 2 + 1 : total / 2;int ub = dat[N - 1] - dat[0];if (ub == 0)puts("0");else{int lb = 0, mid;ub++;while (lb + 1 < ub){mid = (lb + ub) / 2;if (check(mid))ub = mid;elselb = mid;}printf("%d\n", ub);}}}int main(){while (scanf("%d", &N) != EOF){for (int i = 0; i < N; i++)scanf("%d", &dat[i]);solve();}return 0;}


0 0
原创粉丝点击