POJ 3497

题意:给出预算b以及电脑零件n,每种类型均要买一个,求在预算范围内,所有零件配置最低的最大值。

题解:二分答案

View Code
 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 #include<map>

 5 #include<string>

 6 #include<vector>

 7 using namespace std;

 8 map<string,int> MP;

 9 const int inf=0x3f3f3f3f;

10 struct data

11 {

12     int p,q;

13     data(){}

14     data(int _p,int _q){p=_p;q=_q;}

15 };

16 vector<data> po[1005];

17 int n,b,num;

18 bool check(int qq)

19 {

20     int res=b;

21     for(int i=1;i<=num;i++)

22     {

23         int len=po[i].size(),mm=inf;

24         for(int j=0;j<len;j++)

25             if(qq<=po[i][j].q&&po[i][j].p<mm)

26                 mm=po[i][j].p;

27         if(mm==inf)

28             return false;

29         else

30             res-=mm;

31         if(res<0)

32             return false;

33     }

34     return true;

35 }

36 int main()

37 {

38     int T;

39     for(scanf("%d",&T);T;T--)

40     {

41         num=0;

42         scanf("%d%d",&n,&b);

43         MP.clear();

44         for(int i=0;i<n;i++)

45         {

46             char s[100],tp[100];

47             int p,q;

48             scanf("%s %s %d %d",s,tp,&p,&q);

49             if(MP.find(s)==MP.end())

50                 po[MP[s]=++num].clear();

51             po[MP[s]].push_back(data(p,q));

52         }

53         int ans,ll=0,rr=1000000001,mid;

54         while(ll<=rr)

55         {

56             mid=((long long)ll+rr)>>1;

57             if(check(mid))

58             {

59                 ans=mid;

60                 ll=mid+1;

61             }

62             else

63             {

64                 rr=mid-1;

65             }

66         }

67         printf("%d\n",ans);

68     }

69     return 0;

70 }

你可能感兴趣的:(poj)