uva 12124

来源:互联网 发布:怎么与isp网络签署协议 编辑:程序博客网 时间:2024/05/29 05:03

找出最大的质量。利用二分查找,找每一个配件高于中间质量的价格最低的型号。

#include<cstdio>#include<vector>#include<map>#include<iostream>using namespace std;const int maxn = 1000 + 5;struct components{    int price;    int quality;};int cnt, n, tot;map<string, int> ID;int get_id(string s){    if(!ID.count(s))        ID[s] = cnt++;    return ID[s];}vector<components> things[maxn];bool ok(int p){    int sum = 0;    for(int i = 0; i < cnt; i++)    {        int cheapest = tot + 1;        for(int j = 0; j < things[i].size(); j++)        {            if(things[i][j].quality >= p)                cheapest = min(cheapest, things[i][j].price);        }        if(cheapest == tot + 1) return false;        sum = sum + cheapest;        if(sum > tot) return false;    }    return true;}int main(){    int T;    scanf("%d", &T);    while(T--)    {        cnt = 0;        scanf("%d%d", &n, &tot);        for(int i = 0; i < n; i++)            things[i].clear();        ID.clear();        int mq;        for(int i = 0; i < n; i++)        {            string type, name;            int price, quality;            cin>>type>>name>>price>>quality;            mq = max(mq, quality);            int id = get_id(type);            things[id].push_back((components){price, quality});        }        int L = 0, R = mq;        //printf("%d\n", cnt);        while(L < R)        {            //printf("%d %d\n", L, R);            int mid = L + (R - L + 1) / 2;            if(ok(mid)) L = mid;            else R = mid - 1;        }        printf("%d\n", L);    }    return 0;}


原创粉丝点击