二分题 D - Salary Changing codeforce
题意:给出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的更多相关文章
- Codeforces 1251D Salary Changing
D. Salary Changing 大意: 有n个变量, 每个变量有一个取值区间, 要求给这n个变量赋值, 使得n个变量的和不超过S且中位数尽量大(n一定为奇数) 二分答案, 中位数大于等于mid就 ...
- codeforces 1251D Salary Changing (二分+贪心)
(点击此处查看原题) 题意分析 一共有s元钱,要用这些钱给n个人发工资,发给每个人的工资si有最少和最多限制 si ∈[li,ri],在发给n个人的总工资小于s的情况下,要求发给n个人中的工资的中位数 ...
- 一些简单二分题,简单的hash,H(i),字符串题
说在前面: 题是乱七八糟的. 几个二分的题. (但是我的做法不一定是二分,有些裸暴力. 1. Equations HDU - 1496 输入a,b,c,d问你这个方程有多少解.a*x1^2+b*x2^ ...
- WQS二分题集
WQS二分,一种优化一类特殊DP的方法. 很多最优化问题都是形如“一堆物品,取与不取之间有限制.现在规定只取k个,最大/小化总收益”. 这类问题最自然的想法是:设f[i][j]表示前i个取j个的最大收 ...
- 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 ...
- POJ_3122 经典二分题
Pie Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8594 Accepted: 3124 Special Jud ...
- D. Salary Changing(找中位数)
题:https://codeforces.com/contest/1251/problem/D 题意:给你n个单位需要满足达到的区间,再给个s,s是要分配给n的单位的量,当然∑l<=s,问经过分 ...
- Cable master(二分题 注意精度)
Cable master Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 26596 Accepted: 5673 Des ...
- codeforces D Salary Changing
题意:给你n个人,和s块钱,每个人都有一个工资区间,你给所有人都发工资.然后要他们工资的中位数最大. 思路:二分找那个值.那个值要满足至少有n/2+1个工资区间内. #include<cstdi ...
随机推荐
- P2710 数列[fhq treap]
调了一辈子的fhq treap- 如果不会最大子段和 如果不会fhq treap 7个操作- 其中三个查询 单点查询其实可以和区间查询写成一个( fhq treap 的修改操作大概就是 \(split ...
- linq to sql 获取sql与参数添加到日志中
这里的linq to sql并未使用ef 主要有以下内容 1.新增 2.修改 3.删除 4.查询 1.新增,修改,删除获取sql语句通过DataContext.Log获取执行的sql语句 String ...
- win10专业工作站版密钥|win10专业工作站版key|win10专业工作站版激活码
一.windows10专业工作站零售版密钥 永久激活 Win 10 ProfessionalWorkstation Retail [Key]:DXG7C-N36C4-C4HTG-X4T3X-2YV77 ...
- appium知识点
1 appium元素获取技巧 # 就是页面滑动 driver.swipe(x1, y1, x1, y2, t) # 拿到所有跟元素有关的标签,其实是个列表 driver.find_elements_b ...
- 859. Kruskal算法求最小生成树(模板)
给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数. 求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible. 给定一张边带权的无向图G=(V, E),其中V表示 ...
- 【Unity|C#】基础篇(16)——文件读写(I/O类)
[笔记] 文件操作 File / FileInfo / FileStream https://www.runoob.com/csharp/csharp-file-io.html 文本读写 Stream ...
- bookdown学习笔记
主要参考大佬谢益辉的bookdown学习笔记 https://bookdown.org/yihui/bookdown/pandoc.html 灰常之详细 然后clone了他写好的小demo,准备自己试 ...
- 开始自学JAVA了,找到一点有用的资料(不定时更新)
入门代码https://blog.csdn.net/salmonwilliam/article/details/81952387 高精度https://www.cnblogs.com/downrain ...
- SpringMVC 和 Struts2的区别
SpringMVC 和 Struts2的区别 1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方 ...
- prach 839滤波系数