CodeForces - 1251D (贪心+二分)
题意
https://vjudge.net/problem/CodeForces-1251D
您是一个大型企业的负责人。在您的企业当中共有n位员工为您工作,而且非常有趣的事是这个n是一个奇数(n不能被2整除)。
您必须给你的员工分配工资。最初,您有s美元,而第ii个员工应得的薪水应该是li∼ri之间的一个值。而无论怎么分配每个人的工资,您必须使得所有分配的工资的中位数最大。
对于一个长度为奇数的序列,如果要找到他的中位数,就需要先对这个序列进行排序,之后找到中间位置的数字。举例来说:
- 序列[5,1,10,17,6]的中位数是6
- 序列[1,2,1]的中位数是1
保证您有足够的钱来支付最低的工资,即l1+l2+⋯+ln≤s。
注意,您不必把所有的钱都花在员工的开支上。
思路
假设符合要求的中位数为x,首先,按右端点从小到大排序,ri的中位数即是x的上界;按左端点排序,得到x的下界为li的中位数。这个很好理解,画个数轴,基本就是那回事。。然后我们在x的上下界里二分,check所花费用是否小于等于s即可。怎么check呢?考虑贪心,对于ri<x的数,我们就取li,这样可以腾出更多的资金;对于li>x的数,我们取li,也是为了腾出更多资金;对于li~ri穿插x的数,我们先丢一起。通过刚才的判断我们可以得到放到x左边和右边的个数,现在我们遍历穿插的数,如果当前x左边的个数小于右边,那么这个数得用来放到左边,用最小的li即可;否则放到右边,用x的值即可。最后还剩一个数,那就是中位数x啦,所以判断tmp+x<=s即可。
代码
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
struct node
{
ll l,r;
} g[N];
int n;
ll s;
bool cmp1(node a,node b)
{
return a.l<b.l;
}
bool cmp2(node a,node b)
{
return a.r<b.r;
}
node gg[N];
bool check(ll x)
{
ll tmp=0,l=0,r=0,cnt=0; for(int i=1; i<=n; i++)
{
if(g[i].l>x)
tmp+=g[i].l,r++;
else if(g[i].r<x)
{
tmp+=g[i].l,l++;
}
else
{
gg[cnt++]=g[i];
}
}
int i=0,j=cnt-1;
while(i<j)
{
if(l<r)
tmp+=gg[i].l,l++,i++;
else
tmp+=x,r++,j--;
}
// cout<<"gg"<<endl;
return tmp+x<=s;
}
int main()
{
std::ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
cin>>n>>s;
for(int i=1; i<=n; i++)
{
cin>>g[i].l>>g[i].r;
}
sort(g+1,g+1+n,cmp2);
ll R=g[n/2+1].r;
sort(g+1,g+1+n,cmp1);
ll L=g[n/2+1].l;
ll l=L,r=R,mid,ans=L;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid))
{
l=mid+1;
ans=mid;
}
else
r=mid-1;
}
cout<<ans<<endl;
}
return 0;
}
CodeForces - 1251D (贪心+二分)的更多相关文章
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem D (Codeforces 831D) - 贪心 - 二分答案 - 动态规划
There are n people and k keys on a straight line. Every person wants to get to the office which is l ...
- Codeforces Round #768 (Div. 2) D. Range and Partition // 思维 + 贪心 + 二分查找
The link to problem:Problem - D - Codeforces D. Range and Partition time limit per test: 2 second ...
- codeforces 1165F1/F2 二分好题
Codeforces 1165F1/F2 二分好题 传送门:https://codeforces.com/contest/1165/problem/F2 题意: 有n种物品,你对于第i个物品,你需要买 ...
- poj 2782 Bin Packing (贪心+二分)
F - 贪心+ 二分 Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Description ...
- Card Game Cheater(贪心+二分匹配)
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- The 14th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - F 贪心+二分
Heap Partition Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge A sequence S = { ...
- 贪心/二分查找 BestCoder Round #43 1002 pog loves szh II
题目传送门 /* 贪心/二分查找:首先对ai%=p,然后sort,这样的话就有序能使用二分查找.贪心的思想是每次找到一个aj使得和为p-1(如果有的话) 当然有可能两个数和超过p,那么an的值最优,每 ...
- codeforces 1251D Salary Changing (二分+贪心)
(点击此处查看原题) 题意分析 一共有s元钱,要用这些钱给n个人发工资,发给每个人的工资si有最少和最多限制 si ∈[li,ri],在发给n个人的总工资小于s的情况下,要求发给n个人中的工资的中位数 ...
- Codeforces Round #307 (Div. 2) C. GukiZ hates Boxes 贪心/二分
C. GukiZ hates Boxes Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/551/ ...
随机推荐
- ruby读写文件的方法
读文件 #Ruby 读取文件 #方法一 file = File.open("/Users/Desktop/demo.txt","r") while line = ...
- 因为new Date(),我给IE跪了
处理日期格式是日常工作中的常事,我们经常会对日期字符串和日期对象之间进行转换.今天在IE浏览器就踩了这么一个日期转换的坑. new Date()的坑 后端返回的日期字符串格式为:yyyy-MM-dd ...
- 美团点评Kubernetes集群管理实践
背景 作为国内领先的生活服务平台,美团点评很多业务都具有非常显著.规律的”高峰“和”低谷“特征.尤其遇到节假日或促销活动,流量还会在短时间内出现爆发式的增长.这对集群中心的资源弹性和可用性有非常高的要 ...
- WebShell代码分析溯源(七)
WebShell代码分析溯源(七) 一.一句话变形马样本 <?php $e = $_REQUEST['e'];$arr = array($_POST['POST'],);array_map(ba ...
- CEF编译 执行gn args out\Release_GN_x86异常
gn args out\Debug_GN_x86 用来配置编译参数,执行gn args out\Release_GN_x86时异常: Toolchain is out of date. Run &qu ...
- ASP.NET MVC5基础 - Global.asax详解
简介 作用 Global.asax的处理事件 实例说明 总结 简介 Global.asax是一个文本文件,它提供全局可用代码.这些代码包括应用程序的事件处理程序以及会话事件.方法和静态变量.有时该文件 ...
- 使用 mitmdump 进行 selenium webDriver绕过网站反爬服务的方法 pdd某宝 可用
安装: pip install mitmproxy 新建一个脚本 脚本代码: from mitmproxy import ctx injected_javascript = ''' // over ...
- iOS-关于自定义分段选择器的一些小事(Segmented)
系统自带的分段选择就是 UISegmentedControl ,也有一些大佬自定义的 Segmented ,比如Git上的 HMSegmentedControl ,我以前最初的项目中,也有用到过,如果 ...
- 码农-->工程师
微信公众号推送文章记录,侵删 一个猎人的比喻: 当土著拿到猎枪之后,他们射箭的技能退化严重,但因为食物更多了,厨艺有了长足的进展. 当你不再为一些问题担心之后,你就可以把注意力集中在另外一些问题上了. ...
- linux终端 tty pty pts等
linux终端 tty pty pts等 20140608 Chenxin整理 系统变量TERM不知是用来干什么的?它的值有vt100,vt220等,这些值代表什么意思? 环境变量TERM设置为终端机 ...