Gym

题意:给你两行数据,代表每个哑铃的重量,让你移动哑铃使相同重量的哑铃再一起,求移动的哑铃中最大的哑铃重量。

思路:二分答案,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
",l);
    return 0;
}
原文地址:https://www.cnblogs.com/kayiko/p/11277859.html