MM买电脑 | ||||||
| ||||||
Description | ||||||
在学习了一些理论基础后,MM决定要买一台电脑,搞ACM没有电脑是不行的,可是MM对电脑硬件方面一窍不通,于是找来GG帮忙,GG可是软硬件通吃,装一台电脑更是不在话下了。为了适应需求,他们打算购买电脑的各零件,然后回来自己组装。对于电脑中的每一个零件他们买且只买一个。现在的问题是每一种零件都有好多品牌,品牌下又分好多型号,不同型号的价钱不等,同时它们的质量也不一样。而整个电脑的质量取决于各零件中质量最差的那个。所以我们需要在不超出预支金额的情况下,尽量使得质量最差的那个零件的质量最大化,这样我们购买的电脑总体质量才不至于太低。 | ||||||
Input | ||||||
输入数据的第一行有一个整数T,代表测试数据的组数。接下来有T组测试数据。 对于每组测试数据: 第一行有两个整数n和b,分别代表需要购买的零件种类,以及预支金额。 第二行到第n+1行每行代表一个零件的一些信息,这些信息以”类型 型号 价格 “类型”为一个字符串,仅包含小写字母。不超过20个字符。 “型号”为一个字符串,包含字母,数字,下划线。不超过20个字符。 “价格”为一个正整数。 “质量”为一个正整数,数值越大则质量越高。 范围: T ≤ 100 1 ≤ n ≤ 1 000 1 ≤ b ≤ 1 000 000 000 0 ≤ price ≤ 1 000 000 0 ≤ quality ≤ 1 000 000 | ||||||
Output | ||||||
对于每组测试数据,输出一个整数并换行。这个整数代表新电脑的最大质量(即最小的质量最大是多少) | ||||||
Sample Input | ||||||
1 | ||||||
Sample Output | ||||||
9 | ||||||
Hint | ||||||
每组数据保证有解。 | ||||||
Source | ||||||
2012 Spring Contest 5 - Binary Search, Greedy, DP |
分析:
刚开始我对性能从大到小进行枚举,对于每一类物品取价格大于等于该枚举值的价格最小的物品
900+过的
其实对于所有的性能进行二分即可
if(cost > per_cost)
high = mid;
else
low = mid;
这样就可以了
代码:
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <algorithm>
5 #include <map>
6 using namespace std;
7
8 const int maxn = 1005;
9
10 struct point
11 {
12 string s;
13 int a, b;
14 }poin[maxn];
15
16 int n, sum_b;
17 bool check(int x)
18 {
19 int sum = 0;
20 string s1 = poin[0].s;
21 int st = 0, en = 0;
22 for(int i = 0; i < n; i++)
23 {
24 if(poin[i].s != s1)
25 {
26 en = i - 1;
27 bool flag = false;
28 int max_num = 0xffffff;
29 for(int i = st; i <= en; i++)
30 {
31 if(poin[i].b >= x)
32 {
33 flag = true;
34 if(max_num > poin[i].a)
35 {
36 max_num = poin[i].a;
37 }
38 }
39 }
40 if(!flag)
41 return false;
42 sum += max_num;
43 st = i;
44 s1 = poin[i].s;
45 }
46 }
47 //printf("*%d\n",sum);
48 if(sum <= sum_b)
49 return true;
50 else
51 return false;
52 }
53
54 int main()
55 {
56 int t;
57 //freopen("1511.txt","r",stdin);
58 scanf("%d",&t);
59 while(t--){
60 scanf("%d %d",&n, &sum_b);
61 string str;
62 int num[maxn] = { 0 };
63 int k = 0;
64 for(int i = 0; i < n; i++)
65 {
66 cin>>poin[i].s>>str>>poin[i].a>>poin[i].b;
67 num[k++] = poin[i].b;
68 }
69 poin[n].s = "asdf";
70 n++;
71 sort(num, num + k);
72 //int ans_num[maxn];
73 //int k_num = 1;
74 //ans_num[0] = num[0];
75 //for(int i = 1; i < k; i++){
76 // if(num[i] != num[i - 1]){
77 //ans_num[k_num++] = num[i];
78 //printf("%d ",ans_num[k_num - 1]);
79 //}
80 //}
81 int low = 0, high = k - 1;
82 while(low <= high){
83 //printf("%d\n",low);
84 int mid = (low + high) >> 1;
85 if(!check(num[mid]))
86 high = mid - 1;
87 else
88 low = mid + 1;
89 }
90 //printf("%d %d\n",high, low);
91 /*
92 //num[k] = 0;
93 int ans = 0;
94 for(int i = k - 1; i >= 0; i--)
95 {
96
97 if(num[i] == num[i+1])
98 continue;
99 if(check(num[i]))
100 {
101 ans = num[i];
102 break;
103 }
104 // printf("%d %d\n",num[i],check(num[i]));
105 }
106 */
107 printf("%d\n",num[high]);
108 }
109 return 0;
110 }