解题思路:看到的第一眼原本想使用小根堆找出最小的手牌,看了数据量改用了二分法,因为能凑出手牌的数量是单调的
注意事项:
参考代码:
#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语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:650 |
C语言程序设计教程(第三版)课后习题8.1 (Java代码)浏览:828 |
C语言程序设计教程(第三版)课后习题8.9 (C语言代码)浏览:597 |
大神老白 (C语言代码)浏览:694 |
C语言考试练习题_一元二次方程 (C语言代码)浏览:773 |
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:545 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)浏览:1001 |
求组合数 (C语言代码)浏览:1206 |
WU-图形输出 (C++代码)浏览:836 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:660 |
柑橘味砖头 2024-04-04 14:49:53 |
check(int u)的u是判断能不能凑出u套牌,q是有多少张手牌可以拿来拼凑