UVa:12124 Assemble

来源:互联网 发布:f18ef超级大黄蜂数据 编辑:程序博客网 时间:2024/05/16 14:35

最小值最大化。相当于求下界。用二分法。

思路参考白书。

 

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <queue>#include <map>#include <string>#include <algorithm>#define ll long long#define INF 2139062143#define MOD 1000000000#define MAXN 1000005//ios::sync_with_stdio(false);using namespace std;int n,m,b;map<string,int> id;int ID(string str){    if(!id[str]) id[str]=++m;    return id[str];}struct Component{    int price,quality;};vector<Component> vec[1005];bool Judge(int x){    int sum=0;    for(int i=1;i<=m;++i)    {        int minn=INF;        for(int j=0;j<vec[i].size();++j)            if(vec[i][j].quality>=x) minn=min(minn,vec[i][j].price);        if(minn==INF) return false;        sum+=minn;        if(sum>b) return false;    }    return true;}int Bsearch(int low,int high){    int mid=(low+high+1)/2;    while(low<high)    {        if(Judge(mid)) low=mid;        else high=mid-1;        mid=(low+high+1)/2;    }    return  mid;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&b);        char type[25],name[25];        int p,v;        id.clear();        m=0;        int maxn=0;        for(int i=0;i<=n;++i) vec[i].clear();        for(int i=0;i<n;++i)        {            scanf("%s%s%d%d",type,name,&p,&v);            vec[ID(type)].push_back((Component){p,v});            maxn=max(maxn,v);        }        int ans=Bsearch(0,maxn);        printf("%d\n",ans);    }    return 0;}


 

0 0
原创粉丝点击