zoukankan      html  css  js  c++  java
  • C++练习 | 二分练习

    Codeforces 371C : Hamburgers

    #include<bits/stdc++.h>
    using namespace std;
    char B='B',S='S',C='C';
    string t;
    int nb,ns,nc,pb,ps,pc,len;
    long long r1;
    map<char,int> m;
    bool check(long long m1)
    {
        long long need=0;
        if(m1*m[B]>nb)
            need+=(m1*m[B]-nb)*pb;
        if(m1*m[S]>ns)
            need+=(m1*m[S]-ns)*ps;
        if(m1*m[C]>nc)
            need+=(m1*m[C]-nc)*pc;
        return need<=r1;
    }
    int main()
    {
        int num=0;
        cin>>t;
        len=t.length();
        for(int i=0;i<len;i++)
        {
            m[t[i]]++;
        }
        cin>>nb>>ns>>nc>>pb>>ps>>pc>>r1;
        long long l=0,r=max(max(nb,ns),nc)+r1,mid;
        while(l<=r)
        {
            mid=(l+r)/2;
            if(check(mid))
            {
                l=mid+1;
            }
            else
                r=mid-1;
        }
        cout<<r<<endl;
        return 0;
    }

    样例

     

    HDU 2141 : Can you find it?

    签到题(艹)

    样例

    #include<bits/stdc++.h>
    using namespace std;
    int L,N,M,a[507],b[507],c[507],d[1000007],S,x,k;
    int check(int d1[],int c1[],int X)
    {
        int l=0,r=k-1,m;
        for(int i=0;i<M;i++)
        {
            if(d1[r]+c1[i]<X)
                continue;
            l=0;
            r=k-1;
            while(l<=r)
            {
                m=(l+r)/2;
                if(d1[m]+c1[i]==X)
                    return 1;
                if(d1[m]+c1[i]<X)
                {
                    l=m+1;
                }
                else
                {
                    r=m-1;
                }
            }
        }
        return 0;
    }
    int main()
    {
        // freopen("1.in","r",stdin);
        int num=0;
        while(cin>>L>>N>>M)
        {
            num++;
            k=0;
            cout<<"Case "<<num<<":"<<endl;
            for(int i=0;i<L;i++)
                cin>>a[i];
            for(int i=0;i<N;i++)
                cin>>b[i];
            for(int i=0;i<M;i++)
                cin>>c[i];
            sort(c,c+M);
            for(int i=0;i<L;i++)
            {
                for(int j=0;j<N;j++)
                {
                    d[k]=a[i]+b[j];
                    k++;
                }
            }
            sort(d,d+k);
            cin>>S;
            while(S--)
            {
                cin>>x;
                int t=check(d,c,x);
                if(t)
                    cout<<"YES"<<endl;
                else
                    cout<<"NO"<<endl;
            }
        }
        return 0;
    }

    主要思路是把前两个数组的元素两两相加后与第三个数组元素相加的时候使用二分法简化步骤

  • 相关阅读:
    递归算法几个实例---C/C++
    Linux进程管理
    Linux文件传输
    Linux--系统管理
    Git学习笔记
    如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏
    二叉树的非递归层次遍历算法
    二叉树(代码)
    根据后序遍历和中序遍历创建二叉树(代码)
    二叉树性质
  • 原文地址:https://www.cnblogs.com/tsj816523/p/10700857.html
Copyright © 2011-2022 走看看