(事業部の定格。2)教育Codeforcesラウンド75 D.給与を変更します

リンク:

https://codeforces.com/contest/1251/problem/D

質問の意味:

あなたは、大企業の頭です。n個の人々はあなたに仕事、そしてnが奇数(すなわちnが2で割り切れません)。

あなたの従業員に給与を配布する必要があります。最初に、あなたはそれのためのドルを持っている、とi番目の従業員は、Liから里ドルに給料を取得する必要があります。あなたは給与の中央値は、可能な最大となるように給与を配布する必要があります。

奇数長のシーケンスの中央値を見つけるには、あなたはそれをソートし、ソートした後、中央の位置に要素を取らなければなりません。例えば:

シーケンスの中央値は、[5,1,10,17,6] 6、された
シーケンスの中央値[1,2,1]は1です。
つまり、L1、あなたは最低賃金を支払うために十分なお金を持っていることが保証されます+ L2 +⋯+ln≤s。

あなたが給料にすべてのあなたのドルを費やす必要がないことに注意してください。

あなたは、t検定の例に答える必要があります。

アイデア:

ハーフ、裁判官レース貪欲判断。

コード:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
 
const int MAXN = 2e5+10;
 
struct Node
{
    int l, r;
    bool operator < (const Node& rhs) const
    {
        if (this->l != rhs.l)
            return this->l > rhs.l;
        return this->r > rhs.r;
    }
}node[MAXN];
int n;
LL s;
 
bool Check(LL val)
{
    int p = n/2+1;
    LL sum = 0;
    for (int i = 1;i <= n;i++)
    {
        if (node[i].r >= val && p > 0)
        {
            sum += max(val, (LL)node[i].l);
            p--;
        }
        else
        {
            sum += node[i].l;
        }
    }
    return (sum <= s && p == 0);
}
 
int main()
{
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while(t--)
    {
        cin >> n >> s;
        for (int i = 1;i <= n;i++)
            cin >> node[i].l >> node[i].r;
        sort(node+1, node+1+n);
        LL l = 1, r = s;
        LL res = 0;
        while(l <= r)
        {
            LL mid = (l+r)/2;
            //cout << mid << endl;
            if (Check(mid))
            {
                res = max(res, mid);
                l = mid+1;
            }
            else
                r = mid-1;
        }
        cout << res << endl;
    }
 
    return 0;
}

おすすめ

転載: www.cnblogs.com/YDDDD/p/11781085.html