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的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不 ...
随机推荐
- python如何在图片上添加文字(中文和英文)
Python在图片上添加文字的两种方法:OpenCV和PIL 一.OpenCV方法 1.安装cv2 pip install opencv-python 2.利用putText方法来实现在图片的指定位置 ...
- #AcWing系列课程Level-2笔记——5.高精度“+”算法
高精度"+"算法 编写高精度"+",记住下面的过程,代码也就游刃有余了! 1.首先我们要明白大整数是如何存储的? 2.其次存储完,如何运算? 高精度" ...
- springcloud eureka注册中心搭建
环境描述 ① jdk1.8 ② idea ③ springcloud版本 Finchley.SR2 ④ maven3.0+ 导入jar包 <properties> <project. ...
- Gorm 预加载及输出处理(一)- 预加载应用
单条关联查询 先创建两个关联模型: // 用户模型 type User struct { gorm.Model Username string `gorm:"type:varchar(20) ...
- eclipse代码提示完善
转载请注明出处:https://www.cnblogs.com/Higurashi-kagome/p/12263267.html 1.参考https://blog.csdn.net/ithomer/a ...
- POJ 1065 & ZOJ 1025
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> ...
- C++ 指针函数
#include <stdio.h> #include <windows.h> using namespace std; template<typename T> ...
- C#读取静态类常量属性和值
1.背景最近项目中有一个需求需要从用户输入的值找到该值随对应的名字,由于其它模块已经定义了一份名字到值的一组常量,所以想借用该定义.2.实现实现的思路是采用C#支持的反射.首先,给出静态类中的常量属性 ...
- 【译】HTTP/2 为更快速的网站而生
最近在做一个内部的服务对接,使用了Google的gRPC框架,gRPC是基于HTTP/2和protocol buffers实现的,所以额外去了解了一下HTTP/2,找到这这边文章.这篇文章虽然是写于2 ...
- ProjectTool写白包工具,秒级别写H5游戏壳包,可视化操作,极易使用,支持Swift、Objecive-C双语言
这是自动写白包工具,秒级别写H5游戏壳包,可视化操作,极易使用,支持Swift.Objecive-C双语言 扣扣交流群:811715780 [ 官网下载 ] 这是一个白包目录示例 ProjectToo ...