标签:std lse 二分 int weight min cstring 答案 不能
题意:给你两行数据,代表每个哑铃的重量,让你移动哑铃使相同重量的哑铃再一起,求移动的哑铃中最大的哑铃重量。
思路:二分答案,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; }
Gym - 101170F - Free Weights (二分)
标签:std lse 二分 int weight min cstring 答案 不能
原文地址:https://www.cnblogs.com/kayiko/p/11277859.html