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的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不 ...
随机推荐
- 关于nw的简单应用
最近使用到了桌面开发应用nw.js.进行简单的介绍一下,基本用法 nwjs实际上是基于node js的,支持node js的所有api 中文官网https://nwjs.org.cn/ 第一步.在官网 ...
- Python面向对象之:三大特性:继承,封装,多态以及类的约束
前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...
- ajax jsonP 解决跨域问题
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- codevs1743
http://codevs.cn/problem/1743/ splay区间翻转. 数字在原序列中的位置保存在splay的data[]中.splay中点的编号为原序列的数字大小. 每次pushdown ...
- MySQL设置外键报错 #1452 - Cannot add or update a child row: a foreign key constraint fails 解决方法
MySQL数据库,当我尝试在A表中设置B表的主键为外键时,报出错误:#1452 - Cannot add or update a child row: a foreign key constraint ...
- mysql主从复制(主从同步)
mysql主从同步 1.mysql主从同步(复制)概念 1. 将Mysql某一台主机数据复制到其它主机(slaves)上,并重新执行一遍来实现的. 2. 复制过程中一个服务器充当主服务器,而一个或多个 ...
- Redis基本数据类型、数据持久化、过期策略及淘汰机制
一点技术.技术乐享!!! 如果有人问你:Redis这么快,他的“多线程模式”你了解吗? 请回答他:您是想问Redis这么快,为什么还是单线程模式吗? redis是什么 简单来说redis是C语言开发的 ...
- Worktile 进军软件开发与协作的初心与野心
作为国内领先的企业协作工具,过去6年Worktile经历了中国SaaS跌宕起伏的蛮荒时代.当国内2C领域逐步布局成熟,巨头和资本也逐步将目光聚焦在2B这个万亿级大赛道,疫情期间和之后,都将加速企业服务 ...
- 050.集群管理-Prometheus+Grafana监控方案
一 Prometheus概述 1.1 Prometheus简介 Prometheus是由SoundCloud公司开发的开源监控系统,是继Kubernetes之后CNCF第2个毕业的项目,在容器和微服务 ...
- jQuery的简单用法(jQuery的简介,选择器,属性和css,文档处理)
一.jQuery简介 1.1. JS库 JavaScript 库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度交互客户端页面, 并且兼容各大浏览器. 1.2. 当前流行的 JavaSc ...