题意:给你两行数据,代表每个哑铃的重量,让你移动哑铃使相同重量的哑铃再一起,求移动的哑铃中最大的哑铃重量。
思路:二分答案,check函数如果返回1,说明可能存在更小的重量,如果返回是0,说明比真实值大。
check函数里,遍历一遍数组,如果小于的等于mid的数,continual就行。如果第一次发现一个比mid大的数就记录一下,看看能不能找到一个与之匹配的哑铃,再找到相同重量的哑铃之前所遇到的哑铃,如果比mid值大说明此时的mid不成立,否则就继续找,如果找到就继续遍历,没有的话就return 0;
#include<bits/stdc++.h> #include <cstdio> #include<cstring> #define debug(x) cout<<'x'<<' '<<x<<endl; const int INF=0x3f3f3f3f; typedef long long ll; using namespace std; const int maxn = 1e6+10; typedef long long LL; int a[2][maxn]; int n; int check(int x) { int top=0,id=0; for(int i=0;i<2;i++) { for(int j=0;j<n;j++) { if(a[i][j]<=x)continue; else { if(!top){top=a[i][j];id=i;} else if(top==a[i][j]&&id==i){top=0;id=0;continue;} else return 0; } } } return 1; } int main() { scanf("%d",&n); int mi=INF,ma=-1; for(int j=0;j<2;j++) for(int i=0;i<n;i++) { scanf("%d",&a[j][i]); mi=min(mi,a[j][i]); ma=max(ma,a[j][i]); } //debug(1); //cout << mi << ' ' << ma << endl; int l=mi,r=ma,mid; while(l<=r) { //cout<<1<<endl; mid=(l+r)/2; if(check(mid))r=mid-1; else l=mid+1; } if(check(0))l=0; printf("%d\n",l); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律