codeforces D Salary Changing

题意:给你n个人,和s块钱,每个人都有一个工资区间,你给所有人都发工资。然后要他们工资的中位数最大。

思路:二分找那个值。那个值要满足至少有n/2+1个工资区间内。

#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<set>
#define ll long long
using namespace std;
int l[500010];
int r[500010];
int n;
ll s;
int check(int md)
{
    int k=(n+1)/2;
    vector<int> M;
    for(int i=1;i<=n;i++)
    {
        int v=max(l[i],md);
        if(r[i]<v) continue;
        M.push_back(v-l[i]);
    }
    if((int)M.size()<k)
        return 0;
    ll sum=0;
    sort(M.begin(),M.end());
    for(int i=0;i<k;i++)
        sum+=M[i];
    return sum<=s;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {

        scanf("%d%lld",&n,&s);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&l[i],&r[i]);
            s-=l[i];
        }
        int st=0,ed=1e9;
        while(st<ed)
        {
            int md=(st+ed+1)/2;
            if(check(md))
            {
                st=md;
            }
            else
                ed=md-1;
        }
        printf("%d\n",st);
    }
}

原文地址:https://www.cnblogs.com/2462478392Lee/p/11745286.html

时间: 2024-11-14 00:08:40

codeforces D Salary Changing的相关文章

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

链接: https://codeforces.com/contest/1251/problem/D 题意: You are the head of a large enterprise. n people work at you, and n is odd (i.?e. n is not divisible by 2). You have to distribute salaries to your employees. Initially, you have s dollars for it,

CodeForces 396C On Changing Tree

On Changing Tree Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. Original ID: 396C64-bit integer IO format: %I64d      Java class name: (Any) You are given a rooted tree consisting of n vertices numbered from 1 to

D. Salary Changing(找中位数)

题:https://codeforces.com/contest/1251/problem/D 题意:给你n个单位需要满足达到的区间,再给个s,s是要分配给n的单位的量,当然∑l<=s,问经过分配后能够达到的最大中位数是多少 题解:二分找中位数,成立原因:代码注释 #include<bits/stdc++.h> using namespace std; typedef long long ll; #define fo(i,a,b) for(int i=a;i<=b;i++) #de

二分题 D - Salary Changing codeforce

题意:给出n个人(n是奇数),s钱:s为总的可以付工钱的钱: 每一个工人有一个付工钱的区间,只要在这个区间范围内,随便一个数都可以当作给这个工人付了钱: 老板要付给每个工人钱,并且付钱的中位数要尽可能大: 问:最大的中位数是多少: 思路:贪心+思维+二分: 我们以中位数为主体进行二分.那么就需要n/2+1个大于等于中位数的数: 这个时候我们先给钱排序,按第一个数从大到小排: 然后check部分,从1到n遍历,如果满足x在区间范围内,就取x这个数: 那么,为什么就要取这个数呢,因为我们迟早要凑到n

CF1251D Salary Changing

思路: 二分答案. 实现: 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 200005; 5 ll l[N], r[N]; 6 bool check(ll x, int n, ll s) 7 { 8 ll tmp = 0; 9 int low = 0, up = 0; 10 vector<pair<ll, ll>> v; 11 for (

Salary Changing CF-1251D(二分)

题意: 有$n$个员工,$s$元钱,现在要给每个员工发工资.每个员工的工资的范围$(l_i,r_i)$,求所有员工的工资中位数的最大值. 思路: 二分答案,$check$的时候判断工资可以大于等于$mid$的员工个数,用最小代价购买之后判断总价钱会不会超出范围. 代码: 1 //#include<bits/stdc++.h> 2 #include <set> 3 #include <map> 4 #include <stack> 5 #include <

Educational Codeforces Round 75

目录 Contest Info Solutions A. Broken Keyboard B. Binary Palindromes C. Minimize The Integer D. Salary Changing E2. Voting (Hard Version) Contest Info Practice Link Solved A B C D E1 E2 F 6/7 O O O O O O - O 在比赛中通过 ? 赛后通过 ! 尝试了但是失败了 - 没有尝试 Solutions A.

Educational Codeforces Round 75 ABCD题解

A. Broken Keyboard Description 给出一串小写字母字符序列,连续出现两次的字母为坏掉的,按字典序输出所有没有坏掉的字母. Solution 模拟暴力删除字母,注意相同字母的去重. 1 #include <algorithm> 2 #include <cctype> 3 #include <cmath> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <cst

CDQ分治题目小结

CDQ分治属于比较特殊的一类分治,许多问题转化为这类分治的时候,时空方面都会有很大节省,而且写起来没有这么麻烦. 这类分治的特殊性在于分治的左右两部分的合并,作用两部分在合并的时候作用是不同的,比如,通过左半部分的影响来更新右半部分,所以分治开始前都要按照某一个关键字排序,然后利用这个顺序,考虑一个区间[l, r]的两部分间的影响.感觉说的太多,还是不如具体题目分析,而且题目也不尽相同,记住几句话是没什么用的. 练习地址: http://vjudge.net/contest/view.actio