LA3971组装电脑
题意:
你有b块钱,想要组装一台电脑,给你提供一些零件,每种零件提供一个或几个,组装电脑的前提是每种零件只能也必须选择一个,每种零件都有自己的种类,名字,价格,还有品质,要求是在能配成电脑的前提下所有零件中最小的品质最大(品质越大越好)。
思路:
最小的最大,第一反应就是二分,这个题目也不例外,我们只要二分品质就行了,品质的数据感觉比较大,但是直接去枚举应该也能过,如果担心过不了可以先把零件中所有涉及的品质都拿出来,答案肯定是这些数据中的一个,我们只要sort下,然后去二分枚举sort后的品质数组,每次枚举我们都会得到一个当前的品质值,对于每种物品,我们肯定是选择品质值满足要求的最小花费的那个零件,其他的没什么,细心点就行了,具体细节可以看代码。
#include<map>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#define N 1000 + 10
using namespace std;
typedef struct
{
int jg ,pz;
char str[22];
}NODE;
NODE node[N];
map<string ,int>mark;
int tmp[N] ,P[N] ,nowidp;
bool camp(NODE a, NODE b)
{
return a.jg < b.jg;
}
bool ok(int nowpz ,int n ,int szl ,int b)
{
mark.clear();
int sszl = 0 ,nowb = 0;
for(int i = 1 ;i <= n ;i ++)
{
if(node[i].pz < nowpz) continue;
if(!mark[node[i].str]) sszl ++ ,nowb += node[i].jg;
mark[node[i].str] = 1;
}
return sszl == szl && nowb <= b;
}
int main ()
{
int n ,b ,i ,szl ,t;
char str[22];
scanf("%d" ,&t);
while(t--)
{
scanf("%d %d" ,&n ,&b);
mark.clear();
szl = 0;
for(i = 1 ;i <= n ;i ++)
{
scanf("%s %s %d %d" ,node[i].str ,str ,&node[i].jg ,&node[i].pz);
if(!mark[node[i].str]) szl ++;
mark[node[i].str] = 1;
tmp[i] = node[i].pz;
}
sort(node + 1 ,node + n + 1 ,camp);
sort(tmp + 1 ,tmp + n + 1);
nowidp = 0;
for(i = 1 ;i <= n ;i ++)
if(i == 1 || tmp[i] != tmp[i-1])
P[++nowidp] = tmp[i];
int low = 1 ,up = nowidp ,mid ,Ans = P[1];
while(low <= up)
{
mid = (low + up) / 2;
if(ok(P[mid] ,n ,szl ,b))
{
Ans = P[mid];
low = mid + 1;
}
else up = mid - 1;
}
printf("%d\n" ,Ans);
}
return 0;
}
最新文章
- 【iOS 使用github上传代码】详解
- 写了placement new就要写placement delete
- python时间时分秒与秒数的互相转换
- Java Override/Overload
- PHP get_class 返回对象的类名
- 三国杀3v3心法——总述篇
- arcgis通过 Python 使用工具 获得结果信息
- Linux定时任务编写
- HDU 1088 - Write a simple HTML Browser
- 网易云课堂_C语言程序设计进阶_第5周:链表_1逆序输出的数列
- .NET中TextBox控件设置ReadOnly=true后台取不到值 三种解决方法
- 用QFileSystemWatcher来监视文件和目录的改变(内部还是使用了timer)
- winform打开本地html页面
- 列式数据库~clickhouse 数据同步使用
- 【未完待续】API接口
- php的常量
- VMware Station NAT上网模式配置
- c#栈的习题2
- [JavaScript] css将footer置于页面最底部
- 20155303 实验二 Java面向对象程序设计
热门文章
- POJ-2253(最短路变形+dijikstra算法+求解所有路径中所有最长边中的一个最小值)
- Spring笔记(10) - 日志体系
- TripleDES对称加密解密 -[C#-JAVA]
- FreeBSD jail 折腾记(二)
- java 递归求二叉树深度
- P1962 斐波那契数列 【矩阵快速幂】
- PTA 找出不是两个数组共有的元素
- Vite2+Electron仿抖音|vite2.x+electron12+vant3短视频|直播|聊天
- Go 语言入门教程,共32讲,6小时(已完结)
- MongoDB 那些事(一文以蔽之)