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++)
#define fod(i,a,b) for(int i=b;i>=a;i--)
#define pb push_back
#define pll pair<ll,ll> const int inf=0x3f3f3f3f;
const ll INF=1e18;
vector<pll>a;
int n;
ll s;
ll check(ll m){///挑出能达到中位数midd的都要达到中位数和已经比中位数大的数,且只能取一半+1个
///因为a 已经按照从大到小排序了,所以从前往后地挑出能达到midd的来加肯定是耗钱最少的
int countt=a.size()/+;
ll sum=;
for(int i=;i<a.size();i++){
if(a[i].first<=m&&a[i].second>=m&&countt){
sum+=m;
countt--;
}
else{
sum+=a[i].first;
if(a[i].first>m)
countt--;
}
}
if(countt)
return s+;//让这一步不合法
else
return sum;
}
int main(){
int t;
cin>>t;
while(t--){
scanf("%d%I64d",&n,&s);
a.clear();
fo(i,,n){
ll x,y;
scanf("%I64d%I64d",&x,&y);
a.pb(make_pair(x,y));
} sort(a.begin(),a.end());
reverse(a.begin(),a.end());
ll l=a[a.size()/].first+,r=s;
while(l<=r){
ll midd=(l+r)>>;
if(check(midd)<=s)
l=midd+;
else
r=midd-;
}
printf("%I64d\n",l-);
}
return ;
}
D. Salary Changing(找中位数)的更多相关文章
- Codeforces 1251D Salary Changing
D. Salary Changing 大意: 有n个变量, 每个变量有一个取值区间, 要求给这n个变量赋值, 使得n个变量的和不超过S且中位数尽量大(n一定为奇数) 二分答案, 中位数大于等于mid就 ...
- 利用数目找中位数(牛客第七场E)
https://ac.nowcoder.com/acm/contest/887/E 树状数组做法(代码有注释) #include<bits/stdc++.h> using namespac ...
- LeetCode Median of Two Sorted Arrays 找中位数(技巧)
题意: 给两个有序(升or降)的数组,求两个数组合并之后的中位数. 思路: 按照找第k大的思想,很巧妙.将问题的规模降低,对于每个子问题,k的规模至少减半. 考虑其中一个子问题,在两个有序数组中找第k ...
- SGU 114. Telecasting station 三分or找中位数
题目链接点这儿 一開始想都没想...直接上了三分...结果...sample的答案不一样...可是过了...然后又看了看. . . 发现这不就是高中或者初中出过的求中位数的题么. . .直接找到这些的 ...
- codeforces 1251D Salary Changing (二分+贪心)
(点击此处查看原题) 题意分析 一共有s元钱,要用这些钱给n个人发工资,发给每个人的工资si有最少和最多限制 si ∈[li,ri],在发给n个人的总工资小于s的情况下,要求发给n个人中的工资的中位数 ...
- codeforces D Salary Changing
题意:给你n个人,和s块钱,每个人都有一个工资区间,你给所有人都发工资.然后要他们工资的中位数最大. 思路:二分找那个值.那个值要满足至少有n/2+1个工资区间内. #include<cstdi ...
- 找中位数O(n)算法
题目描写叙述: 给定一个未排序的整数数组,找到当中位数. 中位数是排序后数组的中间值,假设数组的个数是偶数个.则返回排序后数组的第N/2个数. 例子 给出数组[4, 5, 1, 2, 3], 返回 3 ...
- 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 ...
- 二分题 D - Salary Changing codeforce
题意:给出n个人(n是奇数),s钱:s为总的可以付工钱的钱: 每一个工人有一个付工钱的区间,只要在这个区间范围内,随便一个数都可以当作给这个工人付了钱: 老板要付给每个工人钱,并且付钱的中位数要尽可能 ...
随机推荐
- c++ 正则表达式查找
C++ 正则表达式的使用 需求: 字符串含有除[0-9a-z]之外的字符,均返回失败! #include<regex> smatch result; string reg_str = &q ...
- [CISCN2019 总决赛 Day2 Web1]Easyweb
0x00 知识点 1:备份文件泄露 2:SQL注入 3:php短标签 短标签<? ?>需要php.ini开启short_open_tag = On,但<?= ?>不受该条控制. ...
- Linux|Zookeeper--CentOS7开机启动Zookeeper
参考 https://www.cnblogs.com/zhangmingcheng/p/7455278.html 在 /etc/rc.d/init.d 下创建zookeeper脚本 #!/bin/ba ...
- Mysql--主库不停机搭建备库
参考:http://blog.csdn.net/luozuolincool/article/details/38494817 mysqldump --skip-lock-tables --single ...
- 洛谷 P5662 纪念品
题目传送门 解题思路: 一道DP,完全背包,不过有点不同于模板.因为本题的每件物品可自由在不同的时间买卖,且不同时间价格不同. 这道题的关键在于要明白一个非常傻逼的性质,就是我在某天买了第i个物品,然 ...
- struct寻址&for反汇编
//for 反汇编 #include<stdio.h> int main() { ; ; ;i<;i++) { s=s+; } s=; ;i>=;i--) { s=s+; } ...
- CTF -攻防世界-web高手区-ics-06
打开网址 根据题意点开报表中心(因为其他的点开都一样,不信你试试) 会看见id =1 想到burp爆破id 所以打开burp抓包(不会抓包的百度 或者看我web新手区,有一题就有抓包 我说的很详细) ...
- SQL基础教程(第2版)第6章 函数、谓词、CASE表达式:6-3 CASE表达式
● 虽然CASE表达式中的ELSE子句可以省略,但为了让SQL语句更加容易理解,还是希望大家不要省略. ● CASE表达式中的END不能省略. ● 使用CASE表达式能够将SELECT语句的结果进行组 ...
- Django1.11创建
Djiango 1.11.1 虚拟环境配置 创建虚拟环境 mkvirtualenv 虚拟环境名字 -p python3 安装django pip install django==1.11.11 卸载包 ...
- Necroptosis|Apoptosis|CTC|
大数据-外周血研究 Necroptosis与Apoptosis...区别:肿瘤导致和自身凋亡. CTC,肿瘤细胞脱落进入外周血,CTC(循环肿瘤细胞,CirculatingTumorCell)是存在于 ...