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;
}
题解:典型最小值最大,一般用二分法,假设一个数是最差质量,然后带入计算是否符合,如果符合就增大,否则就减小,直到达到临界值。
#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;
}
相关文章推荐
- NWERC 2007 / UVa 12124 Assemble (二分搜索&最小值最大问题)
- 【二分答案+贪心】解决“最小值最大”问题(UVa 12124 - Assemble)
- NWERC 2007 / UVa 12124 Assemble (二分搜索&最小值最大问题)
- uva 11419 最大匹配数等于最小覆盖数
- [二分图最大匹配=最小覆盖点]uva12549 Sentry Robots
- UVa 1658 海军上将(最小费用最大流)
- Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)
- 最大流,最小割(水塘,uva 1515)
- UVa 1660 Cable TV Network (最大流,最小割)
- UVA 10480 Sabotage (网络流,最大流,最小割)
- 最大流最小割 UVA - 10480
- (beginer)网络流(最小割最大流) UVA 1212 - Duopoly
- UVA 10480 Sabotage (最大流最小割)
- 11.3.4-uva10048-floyd变形-两点之间路径上最大边的最小值
- UVA 1515 Pool construction 最大流跑最小割
- 【动态规划】UVa 1331 最大面积最小三角形剖分
- UVA 11248 Frequency Hopping (最大流+最小割)
- UVA 10714-Ants(求花费的最大最小时间)
- UVA 10480 Sabotage (最大流最小割输出路劲)
- uva11419 【最大二分匹配求最小点覆盖 匈牙利算法】