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的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不 ...
随机推荐
- 使用增量备份修复DG中的GAP
问题描述 oracle中DG出现主备不同步现象,alert日志报警有gap信息,但是v$archive_gap视图查不到任何信息.同时主库上的对应归档已经删除且没有备份 解决方案 1.查询备库的scn ...
- 五分钟完成 ABP vNext 通讯录 App 开发
五分钟完成 ABP vNext 通讯录 App 开发 ABP vNext(后文简称Abp)是 Volo 公司堪称艺术品级的应用开发框架,它基于领域驱动设计(DDD)的思维,创新地采用了模块化的设计.A ...
- (转)C++ 虚函数表解析
原文地址:http://blog.csdn.net/haoel/article/details/1948051 C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 ...
- Scala尾递归
递归函数应用 首先,我们来对比两个递归方法的求值步骤. 假设有方法gcd,用来计算两个数的最大公约数.下面是欧几里得算法的实现: def gcp(a: Int, b: Int): Int = if ( ...
- JDBC封装-Java(新手)
JDBC的封装,自己总结的自己总结的自己总结的 dao (代码分层)命名规范: 1.com.XXX.dao 存放dao相关的类型 例如 StudentDAOImpl 处理 数据库的链接 存取数据 2. ...
- 0402数据放入集合进行查询-Java(新手)
JDBC工具类: package cn.Wuchang.zyDome; import java.sql.*; public class JDBCUtils { private static final ...
- 嵌入式LCD闪烁--emWin使用内存设备避免闪烁
0.引子 近日在论坛看到有人说屏幕闪烁,问道怎么解决.在嵌入式gui使用方面,屏幕闪烁一般多出现在多个窗口层叠.多图层层叠.更新图层时.受限于接口速度,即使屏幕有很高的刷新率,也做不到无闪烁,所以要从 ...
- POJ1523 Tarjan求割点以及删除割点之后强连通分量的数量
题目链接:http://poj.org/problem?id=1523 SPF:A Single Point of Failure也就是割点(一个点导致网络之间的不连通),由于给出的图是无向图,所以只 ...
- [概率] HDU 2019 Multi-University Training Contest 10 - Valentine's Day
Valentine's Day Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others ...
- 聊聊用Selenium做自动化碰到了哪些坑?都是怎么解决的?
本周我们的讨论话题是关于Selenium自动化: 话题:聊聊用Selenium做自动化碰到了哪些坑?都是怎么解决的? 话题描述:Selenium是大家做UI自动化用到的主流框架,在平时写脚本的过程中, ...