题意:给出n个人(n是奇数),s钱;s为总的可以付工钱的钱;

每一个工人有一个付工钱的区间,只要在这个区间范围内,随便一个数都可以当作给这个工人付了钱;

老板要付给每个工人钱,并且付钱的中位数要尽可能大;

问:最大的中位数是多少;

思路:贪心+思维+二分;

我们以中位数为主体进行二分。那么就需要n/2+1个大于等于中位数的数;

这个时候我们先给钱排序,按第一个数从大到小排;

然后check部分,从1到n遍历,如果满足x在区间范围内,就取x这个数;

那么,为什么就要取这个数呢,因为我们迟早要凑到n/2+1个数,所以从大到小的排序,可以让我们在使用的钱

最少的情况下,取出这n/2+1个这样的数;  比如有这样两个区间“6 10” ”7 11“  按从大到小排序,我们假如中位数为8;

我们假如“6 10" 取中位数8 ”7 11“ 取左端点7 那么结果为15

如果”7 11“ 取中位数, 另一个取左端点,则结果为14;

所以代码如下

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+;
struct node
{
int l,r;
}a[maxn];
ll n;ll s;
bool cmp(node x,node y)
{
return x.l>y.l;
}
int check(ll x)
{
ll sum=;
ll num=n/+;
for(int i=;i<=n;i++){
//当num==0之后,所需要的大于等于n/2+1已经满足,所以都取
//左端点即可;
if(x>=a[i].l&&x<=a[i].r&&num>){
sum+=x;
num--;
}
else{
sum+=a[i].l;
if(a[i].l>=x) num--;
}
}
if(num>) return ;
else{
if(sum>s) return ;
else return ;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%lld%lld",&n,&s);
for(int i=;i<=n;i++){
scanf("%d%d",&a[i].l,&a[i].r);
}
sort(a+,a++n,cmp);
ll l=a[n/+].l;ll r=s;
ll ans=l;
while(l<=r){
ll mid=l+r>>;
if(check(mid)){
ans=mid;
l=mid+;
}
else r=mid-;
}
printf("%lld\n",ans);
}
return ;
}

二分题 D - Salary Changing codeforce的更多相关文章

  1. Codeforces 1251D Salary Changing

    D. Salary Changing 大意: 有n个变量, 每个变量有一个取值区间, 要求给这n个变量赋值, 使得n个变量的和不超过S且中位数尽量大(n一定为奇数) 二分答案, 中位数大于等于mid就 ...

  2. codeforces 1251D Salary Changing (二分+贪心)

    (点击此处查看原题) 题意分析 一共有s元钱,要用这些钱给n个人发工资,发给每个人的工资si有最少和最多限制 si ∈[li,ri],在发给n个人的总工资小于s的情况下,要求发给n个人中的工资的中位数 ...

  3. 一些简单二分题,简单的hash,H(i),字符串题

    说在前面: 题是乱七八糟的. 几个二分的题. (但是我的做法不一定是二分,有些裸暴力. 1. Equations HDU - 1496 输入a,b,c,d问你这个方程有多少解.a*x1^2+b*x2^ ...

  4. WQS二分题集

    WQS二分,一种优化一类特殊DP的方法. 很多最优化问题都是形如“一堆物品,取与不取之间有限制.现在规定只取k个,最大/小化总收益”. 这类问题最自然的想法是:设f[i][j]表示前i个取j个的最大收 ...

  5. 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 peop ...

  6. POJ_3122 经典二分题

    Pie Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8594   Accepted: 3124   Special Jud ...

  7. D. Salary Changing(找中位数)

    题:https://codeforces.com/contest/1251/problem/D 题意:给你n个单位需要满足达到的区间,再给个s,s是要分配给n的单位的量,当然∑l<=s,问经过分 ...

  8. Cable master(二分题 注意精度)

    Cable master Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26596   Accepted: 5673 Des ...

  9. codeforces D Salary Changing

    题意:给你n个人,和s块钱,每个人都有一个工资区间,你给所有人都发工资.然后要他们工资的中位数最大. 思路:二分找那个值.那个值要满足至少有n/2+1个工资区间内. #include<cstdi ...

随机推荐

  1. 【spring】jdbcTemplate之sql参数注入

    demo @Repository("jdbcDao") public class JdbcTemplateDao { @Autowired private JdbcTemplate ...

  2. Gerrit评审代码流程注意事项

    Gerrit管理CR流程时要注意下面两大事项: (一)格式规范 这部分主要是根据公司或者团队的要求规范来撰写格式,这里不做统一介绍了:格式规范的宗旨是让修改的代码和业务需求能够匹配.可追溯. (二)评 ...

  3. 集合使用 Iterator 删除元素

    针对常见的数据集合,比如 ArrayList 列表,对其进行遍历,删除其中符合条件的某个元素,使用 iterator 迭代器进行迭代,代码如下: public class PracticeContro ...

  4. 用texarea存储数据,查询数据库后原样显示在jsp中,包括空格和回车换行

    用texarea存储数据,查询数据库后原样显示在jsp中,包括空格和回车换行

  5. JS获取样式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. vue中封装jsonp

    一.安装jsonp 二.封装

  7. 获取redis实例中最大的top-N key

    需求:获取redis实例中最大的top-N key 说明:由于redis 4.x才引入了memory usage keyname的语法.3.x不支持! db_ip=5.5.5.101 db_port= ...

  8. 2019-08-20 纪中NOIP模拟A组

    T1 [JZOJ6310] Global warming 题目描述 给定整数 n 和 x,以及一个大小为 n 的序列 a. 你可以选择一个区间 [l,r],然后令 a[i]+=d(l<=i< ...

  9. python开发第一篇:初识python

    一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  10. Phalanx HDU - 2859 dp

    #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> us ...