蓝桥杯省赛无忧 编程27 最大通过数

在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+1;
ll a[N],b[N];//这里之所以用ll是因为 后面a[i]会变为前面的数累加 
int n,m,k;
int fun(int mid){//mid为通过关卡数 
// fun函数用于计算给定总通关数mid时的最小紫水晶消耗。
ll ans=k+1;//设定一个大于给定k的值 后面不断更新ans为最小消耗紫水晶数 
for(int i=0;i<=mid;i++){//遍历从0到mid的所有可能的左关卡数i,并检查通过i个左关卡和mid-i个右关卡的紫水晶总消耗。
if(i>n||mid-i>m)continue; //通过i个左关卡数大于n或者右关卡数大于m时跳出循环 不能让a,b越界
ans=min(ans,a[i]+b[mid-i]);//比较当前的ans和通过i个左关卡与mid-i个右关卡所需要的紫水晶的总和,ans返回最小的紫水晶总消耗
} 
return ans;//这个数值将会被用在二分查找中决定最大化关卡数 
}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]+=a[i-1];//这是通过前缀和的方式更新a[i] 保存通过左边每个关卡和所需的紫水晶数量
}
for(int i=1;i<=m;i++){
cin>>b[i];
b[i]+=b[i-1];//这是通过前缀和的方式更新b[i] 保存通过右边每个关卡所需的紫水晶数量 
}
int l=0,r=n+m+1;//因为二分查找性质,通常希望右边界是一个不可能的值,l停留在最后一个可能的值,r停留在第一个不可能的值
while(l+1!=r){//为什么是l+1!=r 保证l和r相邻时循环会停止,l和r之间没有其他值 就是最大值了 r是第一个不能满足条件的值 
int mid=(l+r)/2;
if(fun(mid)>k) r=mid;
//如果fun(mid)返回的紫水晶消耗大于k,则将r更新为 mid;否则,将 l更新为 mid。
else l=mid;
}
cout<<l;//输出 l 作为可能通过的最大关卡数
return 0;
}

在这里插入图片描述

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值