zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    冥想
    格局
    Python_Example_Socket 学习
    Python_Example_Thread 线程 学习/经验/示例
    Python_Example_Process 正则表达 Re 学习/经验/示例
    Python_Example_Process 进程 学习/经验/示例
    Django的认证系统
    form表单
    ajax
    Django之视图
  • 原文地址:https://www.cnblogs.com/kayiko/p/11277859.html
Copyright © 2011-2022 走看看