Problem A - Assemble

Time limit: 2 seconds

Recently your team noticed that the computer you use to practice for programming contests is not good enough anymore. Therefore, you decide to buy a new computer.

To make the ideal computer for your needs, you decide to buy separate components and assemble the computer yourself. You need to buy exactly one of each type of component.

The problem is which components to buy. As you all know, the quality of a computer is equal to the quality of its weakest component. Therefore, you want to maximize the quality of the component with the lowest quality, while not exceeding your budget.

Input

On the first line one positive number: the number of testcases, at most 100. After that per testcase:

  • One line with two integers: 1 ≤ n ≤ 1000, the number of available components and 1 ≤ b ≤ 1000000000, your budget.
  • n lines in the following format: ``type name price quality'', where type is a string with the type of the component, name is a string with the unique name of the component, price is an integer (0 ≤ price < 1000000) which represents the price of the component and quality is an integer (0 ≤ quality ≤ 1000000000) which represents the quality of the component (higher is better). The strings contain only letters, digits and underscores and have a maximal length of 20 characters.

It will always possible to construct a computer with your budget.

Output

Per testcase:

  • One line with one integer: the maximal possible quality.

Sample Input

1
18 800
processor 3500_MHz 66 5
processor 4200_MHz 103 7
processor 5000_MHz 156 9
processor 6000_MHz 219 12
memory 1_GB 35 3
memory 2_GB 88 6
memory 4_GB 170 12
mainbord all_onboard 52 10
harddisk 250_GB 54 10
harddisk 500_FB 99 12
casing midi 36 10
monitor 17_inch 157 5
monitor 19_inch 175 7
monitor 20_inch 210 9
monitor 22_inch 293 12
mouse cordless_optical 18 12
mouse microsoft 30 9
keyboard office 4 10

Sample Output

9
The 2007 ACM Northwestern European Programming Contest
 
题意:你要去自己买个组装机,现在给你每个零件的类别、名字、价钱、级别,以及你有的钱数,求能组装成的机器的最大级别(机器的所有零件中的最小级别,即最小值最大)。
 
解决“最小值最大”问题的常用方法是“二分答案”。
何为二分答案?以本题为例,假设机器的所有零件中的最小级别为x,删除级别小于x的所有配件,若可以组装成一台不超过b元的电脑,那么ans≥x, 否则ans<x;
 
至于如何判断是否可以组装出不超过b元的电脑。利用贪心的思路,每种配件选择最便宜的一个即可。
 
二分部分代码:
 while(L < R)
{
int M = L+(R-L+)/;
if(ok(M)) L = M;
else R = M-;
}

贪心部分代码:

 bool ok(int q)
{
int sum = ;
for(int i = ; i < cnt; i++)
{
int sz = comp[i].size();
int cheapest = b+;
for(int j = ; j < sz; j++)
{
if(comp[i][j].quality >= q)
cheapest = min(cheapest, comp[i][j].price);//选择最便宜的
}
if(cheapest == b+) return false;
sum += cheapest;
if(sum > b) return false;
}
return true;
}

代码如下:

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<vector>
#include<map>
using namespace std;
const int maxn = ; struct Component
{
int price, quality;
};
vector<Component> comp[maxn];
int n, b, cnt; map<string, int> id;
int type_ID(string s)
{
if(!id.count(s)) id[s] = cnt++;
return id[s];
}
bool ok(int q)
{
int sum = ;
for(int i = ; i < cnt; i++)
{
int sz = comp[i].size();
int cheapest = b+;
for(int j = ; j < sz; j++)
{
if(comp[i][j].quality >= q)
cheapest = min(cheapest, comp[i][j].price);
}
if(cheapest == b+) return false;
sum += cheapest;
if(sum > b) return false;
}
return true;
}
int main()
{
int T; scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &b);
int maxq = ; cnt = ; id.clear();
for(int i = ; i < n; i++) comp[i].clear();
for(int i = ; i < n; i++)
{
char type[], name[]; scanf("%s%s", type, name);
int pri, qua; scanf("%d%d", &pri, &qua);
maxq = max(qua, maxq);
Component tmp; tmp.price = pri, tmp.quality = qua;
string tp(type);
comp[type_ID(tp)].push_back(tmp);
}
int L = , R = maxq;
while(L < R)
{
//cout << "-----" <<endl;
int M = L+(R-L+)/;
if(ok(M)) L = M;
else R = M-;
}
printf("%d\n", L);
}
return ;
}

【二分答案+贪心】解决“最小值最大”问题(UVa 12124 - Assemble)的更多相关文章

  1. 洛谷3933 Chtholly Nota Seniorious 二分答案+贪心

    题目链接 题意 给你一个N*M的矩阵 (N,M <=2000)  把他分成两部分 使两部分的极差较大的一个最小  求这个最小值.然后分矩阵的要求是:每个部分内部的方块之间,可以通过上下左右相互到 ...

  2. BZOJ_2196_[Usaco2011 Mar]Brownie Slicing_二分答案+贪心

    BZOJ_2196_[Usaco2011 Mar]Brownie Slicing_二分答案+贪心 Description Bessie烘焙了一块巧克力蛋糕.这块蛋糕是由R*C(1 <= R,C ...

  3. 【二分答案+贪心】UVa 1335 - Beijing Guards

    Beijing was once surrounded by four rings of city walls: the Forbidden City Wall, the Imperial City ...

  4. [CSP-S模拟测试]:kill(二分答案+贪心)

    题目传送门(内部题50) 输入格式 第一行包含四个整数$n,m,s$,表示人数.怪物数及任务交付点的位置.第二行包含$n$个整数$p_1,p_2,...,p_n$.第三行包含$n$个整数$q_1,q_ ...

  5. UVA 12124 Assemble(二分答案)

    题目链接:https://vjudge.net/problem/UVA-12124 垃圾vjudge毁我青春!! 首先这道题是解决“最小值最大”的问题,所以要二分答案. 在这里我们二分$quality ...

  6. 【洛谷】【二分答案+贪心】P1316 丢瓶盖

    [题目描述:] 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? [ ...

  7. BZOJ5321 JXOI2017加法(二分答案+贪心+堆+树状数组)

    二分答案后得到每个位置需要被加的次数.考虑贪心.从左到右考虑每个位置,将以该位置为左端点的区间按右端点从大到小加进堆.看该位置还需要被加多少次,如果不需要加了就不管,否则取堆顶区间将其选择,BIT实现 ...

  8. Gym 100886J Sockets 二分答案 + 贪心

    Description standard input/outputStatements Valera has only one electrical socket in his flat. He al ...

  9. bzoj 4310 跳蚤 —— 后缀数组+二分答案+贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4310 二分答案——在本质不同的子串中二分答案! 如果二分到的子串位置是 st,考虑何时必须分 ...

随机推荐

  1. 网页加载速度优化2--先加载css,然后再加载js文件。

    网页加载时,是按从上到下,从左到右的顺序加载的.所以一定要先加载css文件(不要让用户看到一个杂乱无章的页面),最后再加载js文件,js一般都是处理功能的,所以不需要提前加载.先给用户观感,再给用户上 ...

  2. 嵌入式开发应该掌握的一些Linux命令

    Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正理解Linux系统, ...

  3. TCP 3次握手和四次挥手

    1.标示符说明    位码即tcp标志位: SYN(synchronous建立联机)   ACK(acknowledgement 确认)  PSH(push传送)    FIN(finish结束)   ...

  4. 《Data-Intensive Text Processing with mapReduce》读书笔记之一:前言

    暑假闲得蛋痒,混混沌沌,开始看<Data-Intensive Text Processing with mapReduce>,尽管有诸多单词不懂,还好六级考多了,虽然至今未过:再加上自己当 ...

  5. Yum本地源配置

    1.mount -t auto /dev/cdrom /mnt      使用光驱 mount -t iso9660 -o loop /home/software/rhel-server-6.4-x8 ...

  6. 单点登录sso规范

    http://jasig.github.io/cas/development/protocol/CAS-Protocol-Specification.html

  7. Python subprocess Popen

    目的:顺序执行进程  在Bash里面类似  a.sh && b.sh && c.sh 先来说下Popen这个函数 class subprocess.Popen(args ...

  8. 数组(Array)

    1. 数组(Array):相同类型数据的集合就叫做数组. 2. 数组的定义与赋值(系统会默认初始化) 普通数组: package com.li; public class Array{ public ...

  9. 3、VS2010+ASP.NET MVC4+EF4+JqueryEasyUI+Oracle项目开发之——用户登录

    近期因为项目赶着上线,一直没时间接着写博客,今天最终空出了时间.声名:我不是专业美工,所以界面问题,希望大家不要拍砖.登录界面例如以下: 在ASP.NET MVC中,要新增一个功能,我们首先要加入一个 ...

  10. 【项目经验】如何用TexturePacker & Physicseditor开发游戏

    首先感谢Andreas的license.先广告一下Andreas. ------------------------------------------------------------------ ...