Salary Changing【Codeforces 1251 D】【二分答案】

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_41730082/article/details/102747314

Educational Codeforces Round 75 (Rated for Div. 2) D


  题意:有N名员工和S元钱,然后我们想知道在每一名员工有薪资要求在[li, ri]的情况下,我们如何在总共就S元钱的情况下做到员工薪资的中位数最高?

  思路:我们可以去二分答案这个中位数,那么,如果说右区间小于这个中位数的,我们直接加他的左区间,同样的,当右区间大于这个中位数且左区间小于这个中位数(这里提到的中位数都指的是二分答案的答案)那么就直接判断,如果现在小的还不够,就直接用小的,如果小的够多了,就让他取中位数的钱,再最后就是,左区间也大于中位数的,那么直接使用左区间即可。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 2e5 + 7;
int N, hlf;
ll s;
ll l = 1, mid = 0, r = 2e14;
struct node
{
    ll l, r;
    node(ll a=0, ll b=0):l(a), r(b) {}
    friend bool operator < (node e1, node e2)
    {
        if(e1.r < mid && e2.r < mid) return e1.l < e2.l;
        else if(e1.r >= mid && e2.r >= mid) return e1.l < e2.l;
        else if(e1.r < mid && e2.r >= mid) return true;
        else return false;
    }
}a[maxN];
inline ll query()
{
    l = 1; mid = 0; r = 2e14;
    ll ans = 1;
    hlf = (N + 1) >> 1;
    while(l <= r)
    {
        mid = (l + r) >> 1;
        sort(a + 1, a + N + 1);
        if(a[hlf].r < mid) { r = mid - 1; continue; }
        ll cost = 0;
        for(int i=1; i<hlf; i++)
        {
            cost += a[i].l;
        }
        for(int i=hlf; i<=N; i++)
        {
            cost += max(mid, a[i].l);
        }
        if(cost <= s)
        {
            l = mid + 1;
            ans = mid;
        }
        else r = mid - 1;
    }
    return ans;
}
int main()
{
    int T; scanf("%d", &T);
    while(T--)
    {
        scanf("%d%lld", &N, &s);
        for(int i=1; i<=N; i++) scanf("%lld%lld", &a[i].l, &a[i].r);
        printf("%lld\n", query());
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41730082/article/details/102747314