当前位置:网站首页>D - Project Planning--二分
D - Project Planning--二分
2022-08-03 21:03:00 【秦小咩】
Time Limit: 2 sec / Memory Limit: 1024 MB
Score : 400400 points
Problem Statement
KEYENCE has NN departments, where A_iAi employees belong to the ii-th department (1 \leq i \leq N)(1≤i≤N). No employee belongs to multiple departments.
The company is planning cross-departmental projects. Each project will be composed of exactly KK employees chosen from KK distinct departments.
At most how many projects can be made? No employee can participate in multiple projects.
Constraints
- 1 \leq K \leq N \leq 2 \times 10^51≤K≤N≤2×105
- 1 \leq A_i \leq 10^{12}1≤Ai≤1012
- All values in input are integers.
Input
Input is given from Standard Input in the following format:
NN KK A_1A1 A_2A2 \ldots… A_NAN
Output
Print the maximum possible number of projects.
Sample Input 1 Copy
Copy
3 3 2 3 4
Sample Output 1 Copy
Copy
2
There can be two projects, each composed of three employees from distinct departments.
Sample Input 2 Copy
Copy
4 2 1 1 3 4
Sample Output 2 Copy
Copy
4
Sample Input 3 Copy
Copy
4 3 1 1 3 4
Sample Output 3 Copy
Copy
2
=========================================================================
数据范围小的话优先队列贪心是很容易理解的。但本题需要二分,或许用到的这个结论是很普遍,需要特殊记住的计数问题,那就是n个小组,每组k个物体,要求组内不能重复,那么最终判定条件是所有小于等于n(大于n取等于n)的个数要 >= n*k,也就是说,只要数量够了,一定能构造出来不重复n个序列,很不好想或者去证明,只能说是一个计数结论罢了

注意r太大会爆掉,故我们取r=1e18/k,再乘k的时候就不会爆掉了,当然128位也是很方便。
题目没一般说明我们都是在1e18内获取答案的
# include <iostream>
# include<vector>
# include<queue>
# include<map>
# include<vector>
# include<algorithm>
# include<cstring>
# include<iomanip>
# include<set>
# include<math.h>
using namespace std;
typedef __int128 ll;
__int128 read(){
__int128 x=0,f=1;
char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
}
void print(__int128 x){
if(x<0)putchar('-'),x=-x;
if(x>9)print(x/10);
putchar(x%10+'0');
}
ll a[200000+10];
ll k,n;
bool check(ll mid)
{
ll sum=0;
for(int i=1;i<=n;i++)
{
sum+=min(mid,a[i]);
}
return mid*k<=sum;
}
int main()
{
n=read();
k=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
}
ll l=1,r=1e18;
while(l<=r)
{
ll mid=(l+r)>>1;
if(check(mid))
l=mid+1;
else
r=mid-1;
}
print(r);
return 0;
}
边栏推荐
- 华为设备配置VRRP与BFD联动实现快速切换
- AWTK开发编译环境踩坑记录1(编译提示powershell.exe出错)
- 图神经网络怎么入门?一文带你了解图神经网络入门路径-GNN入门
- Leetcode 899. An orderly queue
- 直播源码开发,各种常见的广告形式
- 华为设备配置VRRP与BFD联动实现快速切换
- tidyverse based on data.table?
- 微信小程序 生成跳转体验版url,可直接跳转到体验版小程序(可通过此方法测试模板消息)
- 开源一夏 |如何优化线上服务器
- PyCharm function automatically add comments without parameters
猜你喜欢
随机推荐
详解虚拟机!京东大佬出品 HotSpot VM 源码剖析笔记(附完整源码)
XSS测试
直播小程序源码,UI自动化中获取登录验证码
《QDebug 2022年7月》
卷起来!阿里高工携 18 位高级架构师耗时 57 天整合的 1658 页面试总结
Zero trust, which has been popular for more than ten years, why can't it be implemented?
Android build error: Plugin with id ‘kotlin-android‘ not found.
ES6 - Arrow Functions
Leetcode 899. An orderly queue
StoneDB 助力 2022 开放原子全球开源峰会
剑指 Offer 16. 数值的整数次方
leetcode 剑指 Offer 58 - II. 左旋转字符串
回忆三年浮沉
有趣的opencv-记录图片二值化和相似度实现
伪标签汇总
直播源码开发,各种常见的广告形式
XSS线上靶场---prompt
leetcode 326. 3 的幂
系统运维系列 之CSV文件读取时内容中包含逗号的处理方法
leetcode 461. 汉明距离








