Assemble UVALive - 3971 -二分答案(最小值最大化)

  •  
  • Assemble

  •  UVALive - 3971 
  • 题意:你有b块钱,想要组装一台电脑。给出n个配件格子的种类,品质因子和价格,
  • 要求每种类型的配件各买一个。总价格不超过b,且品质最差的配件的品质因子尽量大。
  • 思路:求出单个的最大值,这是二分答案的上界,0为下界,求一个最小值的最大化
  • 所以只要check满足就要把L去接近R,最后输出第一个不满足的前一个
  • #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    string type,name;
    int pr,qa,m,n,t;
    int l,r,cnt;
    #define maxn 1555
    map<string,int>mmp;
    struct node
    {
        int prize,q;
    };
    vector<node>num[maxn];
    bool check(int x)
    {
        ll sum=0;
        for(int i=1; i<=cnt; i++)
        {
            int len=num[i].size(),minn=m+10;
            for(int j=0; j<len; j++)
            {
                if(num[i][j].q>=x)
                    minn=min(minn,num[i][j].prize);
            }
            sum+=minn;
            if(sum>m)return 0;
        }
        return 1;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>t;
        while(t--)
        {
            for(int i=1; i<=cnt; i++)
                num[i].clear();
            cnt=r=l=0;
            mmp.clear();
            cin>>n>>m;
            for(int i=0; i<n; i++)
            {
                cin>>type>>name>>pr>>qa;
                if(mmp[type]==0)
                    mmp[type]=++cnt;
                num[cnt].push_back(node{pr,qa});
                r=max(r,qa);
            }
            while(l<r)
            {
                int mid=(l+r+1)/2;
                if(check(mid))l=mid;
                else r=mid-1;
            }
            cout<<r<<endl;
        }
        return 0;
    }
    
  •  
  •  

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/83927867