what the fuck!(二分查找 / 暴力模拟)
Description
现在有一家公司有nnn个员工(nnn为奇数),他们的工资发放是基本工资+提成,现在这家公司计划再招一批人。要写一篇招聘启事,但是对于这个招聘启事中的薪资具体要写多少犯愁了。
规定招聘启事中薪资为nnn个工人中工资的中位数,为了能更快的招到人,招聘启事中写的薪资越大越好。
现在给出每个人的基本工资,以及可以用来发工资的总钱,你可以自由分配他们的提成(给出的钱可以不用完),让你求出最大的中位数。(保证有答案)
Input
第一行两个整数n,sn,sn,s。表示有nnn个工人,sss是总的钱数。(1≤n≤2e5,1≤s≤2e121\leq n \leq 2e5,1 \leq s \leq 2e121≤n≤2e5,1≤s≤2e12)
第二行有nnn个空格隔开的整数,第iii个数字aia_iai表示第iii个人的基本工资。1≤ai≤1e91 \leq a_i \leq 1e91≤ai≤1e9
Output
一个整数表示最大可能的中位数。
Source
lmz
思路
- 二分思路:对于这题我们把总工资m, 减去基础工资,对基础工资排序后, 那么剩余的钱我们可以合理的发给 后面n/2-1个人,那么前面的那些人是不会影响答案的,我同过二分 n/2-1这个人的工资,看是否有大于等于 n/2-1 人的工资(经过我们分配 钱之后),如果有的话我们继续提高上限,对于在基础工资上分配,我们要遵从贪心的思想,按从基础工资高的人开始分配与 二分工资于这个人的基础工资的 差值
题解一(暴力模拟)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
#define db double
#define ll long long
const int Len = 1e6 + 5;
ll sum[Len];
ll ar[Len];
int main()
{
//freopen("A.txt","r",stdin);
ll n,m;
scanf("%lld %lld", &n, &m);
for(int i = 1; i <= n; i ++)
scanf("%lld", &ar[i]);
if(n == 1)
{
printf("%lld\n", m + ar[1]);
return 0;
}
sort(ar + 1, ar + 1 + n);
for(int i = 1; i <= n; i ++)
sum[i] = sum[i - 1] + ar[i];
m -= sum[n];
ll mx = -1;
int cnt = 1;
int i;
for(i = n/2+1; i < n; i ++)
{
if((ar[i+1] - ar[i])*cnt <= m)
{
mx = ar[i + 1];
m -= (ar[i+1] - ar[i]) * cnt;
cnt ++;
}
else
break;
}
if(m > 0)
{
if(i == n)
printf("%lld\n", ar[n] + m/(n/2+1));
else
printf("%lld\n", ar[n/2 + cnt] + m/(cnt));
}
else
printf("%lld\n", mx == -1 ? ar[n/2+1] : mx);
return 0;
}
题解二 (二分查找)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
const int Len = 2e5 + 10;
ll ar[Len];
ll n,m;
bool judge(int mid)
{
int val = mid;
int cnt = 0, mon = m;
for(int i = n; i >= 1; i --)
{
if(ar[i] - val >= 0)
cnt ++;
else if(val - ar[i] <= mon)
cnt ++, mon -= (val - ar[i]);
else
break;
if(cnt >= n/2 + 1) return true;
}
return false;
}
int main()
{
//freopen("A.txt","r",stdin);
scanf("%lld %lld", &n, &m);
for(int i = 1; i <= n; i ++)
scanf("%lld", &ar[i]), m -= ar[i];
sort(ar + 1, ar + 1 + n);
ll l = ar[n/2 + 1], r = ar[n] + m;
ll ans, mid;
while(l <= r)
{
mid = (l + r) >> 1;
if(judge(mid))
l = mid + 1, ans = mid;
else
r = mid - 1;
}
printf("%lld\n", ans);
return 0;
}
what the fuck!(二分查找 / 暴力模拟)的更多相关文章
- 二分查找/暴力 Codeforces Round #166 (Div. 2) B. Prime Matrix
题目传送门 /* 二分查找/暴力:先埃氏筛选预处理,然后暴力对于每一行每一列的不是素数的二分查找最近的素数,更新最小值 */ #include <cstdio> #include < ...
- hdoj 2141 Can you find it?【二分查找+暴力】
Can you find it? Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/10000 K (Java/Others ...
- leetcode 31. Next Permutation (下一个排列,模拟,二分查找)
题目链接 31. Next Permutation 题意 给定一段排列,输出其升序相邻的下一段排列.比如[1,3,2]的下一段排列为[2,1,3]. 注意排列呈环形,即[3,2,1]的下一段排列为[1 ...
- 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)
洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...
- 实现 sqrt(x):二分查找法和牛顿法
最近忙里偷闲,每天刷一道 LeetCode 的简单题保持手感,发现简单题虽然很容易 AC,但若去了解其所有的解法,也可学习到不少新的知识点,扩展知识的广度. 创作本文的思路来源于:LeetCode P ...
- 分治算法(二分查找)、STL函数库的应用第五弹——二分函数
分治算法:二分查找!昨天刚说不写算法了,但是突然想起来没写过分治算法的博客,所以强迫症的我…… STL函数库第五弹——二分函数lower_bound().upper_bound().binary_se ...
- [LeetCode] #167# Two Sum II : 数组/二分查找/双指针
一. 题目 1. Two Sum II Given an array of integers that is already sorted in ascending order, find two n ...
- [LeetCode] #1# Two Sum : 数组/哈希表/二分查找/双指针
一. 题目 1. Two SumTotal Accepted: 241484 Total Submissions: 1005339 Difficulty: Easy Given an array of ...
- 深入浅出数据结构C语言版(12)——从二分查找到二叉树
在很多有关数据结构和算法的书籍或文章中,作者往往是介绍完了什么是树后就直入主题的谈什么是二叉树balabala的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不 ...
随机推荐
- 为什么要使用webpack?
在网页中会引用到哪些常见的静态资源? js (.js .jsx .coffee .ts) css (.css .less .sass .scss scss是sass的plus版) imag ...
- ZYNQ入门实例——定时器中断与程序固化
一.前言 APU系统中CPU以串行执行代码的方式完成操作,软件方式很难做到精准计时,因此调用内部定时器硬件完成计时是更好的选择.本文以定时器中断方式控制LED周期性闪烁为例学习私有定时器的使用.同时学 ...
- vue自定义指令要点
vue自定义指令的基础使用这里就不阐述,看官网文档:https://cn.vuejs.org/v2/guide/custom-directive.html 本文用一个实例描述自定义指令的要点,自定义一 ...
- Windows10 JDK1.8安装及环境变量配置
一.下载JDK1.8: 下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html 二.安装步骤: 我们通常选择 ...
- Block as a Value for SQL over NoSQL
作者 Yang Cao,Wenfei Fan,Tengfei Yuan University of Edinburgh,Beihang University SICS, Shenzhen Univer ...
- LCN解决分布式事务原理解析+项目实战(原创精华版)
写在前面: 原创不易,如果觉得不错推荐一下,谢谢! 由于工作需要,公司的微服务项目需解决分布式事务的问题,且由我进行分布式事务框架搭建和整合工作. 那么借此机会好好的将解决分布式事务的内容进行整理一下 ...
- maven如何安装oracle驱动jdbc的jar包
一.因为oracle驱动的压缩包在maven官网上并没有提供,所以需要自己去手动下载. 二.下载安装步骤如下: (1)第一步:找到你本地的oracle驱动包所在位置: (2)在cmd中打开jar包所在 ...
- Frist
大家好,这是我开通博客的第一天,开通博客呢原因是在于想提升自己.我现在是一名大一的计算机科学与技术的学生,自己本来就对计算机感兴趣,现在想通过博客园这个平台写一些自己感兴趣的文章.现在主要在学java ...
- M-Renamer方法名修改器,iOS项目方法名重构,Objective-C/Swift,代码模型预判,减少误改的机率,替换速度更快,可视化操作,傻瓜式操作,一键操作,引用处自动修改,马甲包的福音
M-Renamer M-Renamer(Method-Name-Renamer)类方法名修改器,采用链式解析头文件,代码模型预判,减少误改的机率,替换速度更快:可以解析整个项目大多数类的方法,可视化操 ...
- Android AlertDialog 各种弹框代码
1.消息框 btn01.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ...