解题思路:看到的第一眼原本想使用小根堆找出最小的手牌,看了数据量改用了二分法,因为能凑出手牌的数量是单调的
注意事项:
参考代码:
#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语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:564 |
剔除相关数 (C语言代码)浏览:1008 |
C二级辅导-进制转换 (C语言代码)浏览:615 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:583 |
【求[X,Y]内被除3余1并且被除5余3的整数的和】 (C语言代码)浏览:672 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:536 |
水仙花 (C语言代码)浏览:1047 |
蚂蚁感冒 (C语言代码)浏览:1319 |
核桃的数量 (C语言代码)浏览:870 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:486 |
柑橘味砖头 2024-04-04 14:49:53 |
check(int u)的u是判断能不能凑出u套牌,q是有多少张手牌可以拿来拼凑