Gym - 101170F - Free Weights (二分)
Posted kayiko
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gym - 101170F - Free Weights (二分)相关的知识,希望对你有一定的参考价值。
题意:给你两行数据,代表每个哑铃的重量,让你移动哑铃使相同重量的哑铃再一起,求移动的哑铃中最大的哑铃重量。
思路:二分答案,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 (二分)的主要内容,如果未能解决你的问题,请参考以下文章
android编程android:layout_weight="1"报错“Invalid layout param in a RelativeLayout: layout_weig
Gym101522A Gym101522C Gym101522D