uvalive 3971 - Assemble(二分搜索 + 贪心)
2024-08-26 10:57:02
题目大意:有若干个零件, 每个零件给出的信息有种类, 名称, 价格, 质量, 现在给出一个金额, 要求在这个金额范围内, 将每个种类零件都买一个, 并且尽量让这些零件中质量最小的越大, 输出质量最小的值。
解题思路:首先可以用二分搜索确定质量, 然后在搜索的过程中要判断这个质量是否能被满足, 判断函数可以用贪心, 在每一类的零件中选择价格最低且质量大于等于当前质量的零件。(事先按照价格大小排序)。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1005;
const int M = 25; struct State {
char name[M];
int money;
int wei;
}s[N][N];
int cnt, sum, son[N];
char str[N][M], sex[M]; bool cmp(const State& a, const State& b) {
return a.money < b.money;
} int find(char sex[]) {
for (int i = 0; i < cnt; i++)
if(strcmp(sex, str[i]) == 0)
return i;
strcpy(str[cnt], sex);
return cnt;
} bool judge(int Min) {
int tmp = 0;
for (int i = 0; i < cnt; i++) {
int flag = 1;
for (int j = 0; j < son[i]; j++) {
if (s[i][j].wei >= Min) {
flag = 0;
tmp += s[i][j].money;
break;
}
}
if (flag || tmp > sum) return false;
}
return true;
} int main() {
State now;
int cas, n, cur, L, R;
scanf("%d", &cas);
while (cas--) {
memset(s, 0, sizeof(s));
memset(son, 0, sizeof(son));
memset(str, 0, sizeof(str));
cnt = L = R = 0; scanf("%d%d", &n, &sum);
for (int i = 0; i < n; i++) {
scanf("%s%s%d%d", sex, now.name, &now.money, &now.wei);
if (now.wei > R) R = now.wei;
cur = find(sex);
s[cur][son[cur]++] = now;
if (cur == cnt) cnt++;
} for (int i = 0; i < cnt; i++)
sort(s[i], s[i] + son[i], cmp); int mid;
while (L < R) {
mid = (L + R) / 2;
if (L == mid) break;
if (judge(mid))
L = mid;
else
R = mid;
}
if (judge(mid + 1)) mid++;
printf("%d\n", mid);
}
return 0;
}
最新文章
- Navicat软件中mysql中int、bigint、smallint和tinyint的区别、布尔类型存储以及乱码问题的解决
- MyBK
- jenkins, ant, pmd持续集成
- 记一次【求n以内的素数个数】的优化记录
- python 进程间共享数据 (三)
- SIFT 特征提取算法总结
- EF CRUD 操作
- WPF ICommand 用法
- 返回某个界面——nav
- 【额 原来ms sqlserver 中的视图果然是“虚表”哈】
- And Then There Was One(约瑟夫问题变形)
- 使用TransactionScope(轻量级事务)实现数据库操作事务
- Oracle Applications DBA 基础(一)
- 将本地代码备份到Github public repository
- 分布式监控系统Zabbix3.4-针对MongoDB性能监控操作笔记
- ajax多级菜单栏
- Neural Networks and Deep Learning(week4)Deep Neural Network - Application(图像分类)
- 给网卡设备添加两个IP别名(一个网卡绑定多个ip)
- Nginx搭建正向代理服务器
- MVC的JavaScriptResult使用
热门文章
- [HDU 4741]Save Labman No.004[计算几何][精度]
- 飘逸的python - 有的升序有的降序的情况下怎么多条件排序
- 【技术引擎——汇聚IT思想之间的碰撞】
- 如何:打开 IIS 管理器
- 深入解读JavaScript面向对象编程实践
- UITextView 限制输入字数
- If We Were a Child Again
- Hadoop MR Job 关于如何控制Map Task 数量
- Java ";==和equals区别";
- 关于JVM的GC机制