hdu 2333

View Code
Problem : 2333 ( Assemble )     Judge Status : Accepted
RunId : 5747850    Language : C++    Author : billforum
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
#include <iostream>
 #include <algorithm>
 #include <cstring>
 #include <stdio.h>

 using namespace std;
 
 const int N=1005;
 const int M=1000000005;
 struct node
 {
     char type[25];
     int pri,qua;
 };
 node nd[N];
 int mark[N];
 int n,p,mnum;
 bool cmp(node x,node y)
 {
     if(strcmp(x.type,y.type)==0) return (x.qua>y.qua);
     else return(strcmp(x.type,y.type)<0);
 }
 bool test(int x)
 {
     int sum=0;
     for(int i=0;i<mnum;i++)
     {
         int minx=M;
         for(int j=mark[i];j<mark[i+1];j++)
         {
             if(x<=nd[j].qua)
             {
                 minx=min(minx,nd[j].pri);
             }
         }
         if(minx==M) return false;
         sum+=minx;
     }
     if(sum>p) return false;
     else return true;
 }
 int main()
 {
    int t,Min,Max;
    bool flag=0;
    char name[25];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&n,&p);
        Min=1000000005;
        Max=0;
        mnum=0;
        flag=0;
        for(int i=0;i<N;i++)
            mark[i]=0;
        for(int i=0;i<n;i++)
            {
                scanf("%s %s %d %d",nd[i].type,name,&nd[i].pri,&nd[i].qua);
                if(nd[i].qua<Min) Min=nd[i].qua;
                if(nd[i].qua>Max)  Max=nd[i].qua;
            }
        sort(nd,nd+n,cmp);    
        for(int i=1;i<n;i++)
        {
            if(strcmp(nd[i].type,nd[i-1].type)!=0)
                mark[++mnum]=i;
        }
        mark[++mnum]=n;
        while(Min<=Max)
        {
            int mid=(Min+Max)>>1;
            if(test(mid))
            {
                flag=1;
                Min=mid+1;
            }
            else
                Max=mid-1;
        }
        if(flag==1) printf("%d\n",Max);
        else printf("0\n");
    }
         return 0;
 }
posted @ 2012-04-10 21:15  wuzhibin  阅读(340)  评论(0)    收藏  举报