您的位置:首页 > 其它

uva 12124(最小值最大)

2015-01-29 17:03 295 查看
题意:有一个人有b元,要去买零件,有n个零件,零件有不同的种类,名称,价格,质量,要求每种零件买一个,不超过b元钱,让最差质量尽量好,问最差质量是多少。

题解:典型最小值最大,一般用二分法,假设一个数是最差质量,然后带入计算是否符合,如果符合就增大,否则就减小,直到达到临界值。

#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
const int N = 1005;
struct Comp {
int pri, qua;
};
vector<Comp> comp
;
map<string, int> m;
int n, b, cnt;

bool judge(int x) {
int sum = 0;
for (int i = 0; i < cnt; i++) {
int chpt = b + 1, k = comp[i].size();
for (int j = 0; j < k; j++)
if (comp[i][j].qua >= x)
chpt = min(chpt, comp[i][j].pri);
if (chpt == b + 1)
return false;
sum += chpt;
if (sum > b)
return false;
}
return true;
}

int main() {
int t;
scanf("%d", &t);
while (t--) {
m.clear();
cnt = 0;
scanf("%d%d", &n, &b);
for (int i = 0; i < n; i++)
comp[i].clear();
char s1[30], s2[30];
int r = -1, l = 0, x, y;
for (int i = 0; i < n; i++) {
scanf("%s%s%d%d", s1, s2, &x, &y);
r = max(r, y);
if (!m.count(s1))
m[s1] = cnt++;
comp[m[s1]].push_back((Comp){x, y});
}
while (l <= r) {
int mid = (l + r) / 2;
if (judge(mid))
l = mid + 1;
else
r = mid - 1;
}
printf("%d\n", r);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva