解题思路:看到的第一眼原本想使用小根堆找出最小的手牌,看了数据量改用了二分法,因为能凑出手牌的数量是单调的
注意事项:
参考代码:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define int long long
const int N=2e5+5;
using namespace std;
int w[N],limit[N],n,q;
int l=INF,r=0;
bool check(int u){//判断能不能凑出这么多牌
int sum=0;
for(int i=1;i<=n;i++){
if(u<=w[i]+limit[i]){
int z=0;//为了对上long long
sum+=max(z,u-w[i]);
}else{return false;}
}
if(sum<=q){return true;}
return false;
}
signed main()
{
ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>w[i];
l=min(l,w[i]);//判断左边界
}
for(int i=1;i<=n;i++){
cin>>limit[i];
r=max(r,w[i]+limit[i]);//右边界
}
//右边是凑不出的,左边是凑的出的
while(l+1!=r){
int m=(l+r)>>1;
if(check(m)){l=m;}
else{r=m;}
}
cout<<l<<endl;
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复