【二分答案】 【POJ3497】 【Northwestern Europe 2007】 Assemble 组装电脑
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 3171 | Accepted: 1013 |
Description
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 ≤ 1 000, the number of available components and 1 ≤ b ≤ 1 000 000 000, 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 ≤ 1
000 000) which represents the price of the component and quality is an integer (0 ≤ quality ≤ 1 000 000 000) 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.
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
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef struct node
{
char name[30];
char type[30];
int price;
int quality;
int TYPE;
}node;
node thing[1010];
int flag[1010];
int anslist[1010];
int n,b,cnt,ans;
int cmp(const void *i,const void *j)
{
node *ii=(node *)i,*jj=(node *)j;
return strcmp(ii->type,jj->type);
}
int cmp3(const void *i,const void *j)
{
return *(int *)i-*(int *)j;
}
int OK(int std)
{
int sum=0,PRICE;
for(int i=1;i<=cnt;i++)
{
PRICE=1000001;
for(int j=flag[i];j<flag[i+1];j++)
if(thing[j].quality>=std)
if(thing[j].price<PRICE) PRICE=thing[j].price;
if(PRICE==1000001) return 0;
else sum=sum+PRICE;
}
if(sum<=b) return 1;
else return 0;
}
int getans()
{
int i,j,m;
i=1;j=n;
while(i<j)
{
m=(i+j)/2+1;
if(OK(anslist[m])) i=m;
else j=m-1;
}
ans=i;
}
int main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
cnt=1;
scanf("%d%d\n",&n,&b);
for(int i=1;i<=n;i++)
{
scanf("%s %s %d %d\n",thing[i].type,thing[i].name,&thing[i].price,&thing[i].quality);
anslist[i]=thing[i].quality;
}
qsort(thing+1,n,sizeof(thing[1]),cmp);
qsort(anslist+1,n,sizeof(anslist[1]),cmp3);
flag[cnt]=1;
for(int i=2;i<=n;i++)
{ if(strcmp(thing[i].type,thing[i-1].type)==0) thing[i-1].TYPE=cnt;
else
{
thing[i-1].TYPE=cnt;
cnt++;
flag[cnt]=i;
}
}
flag[cnt+1]=n+1;
thing[n].TYPE=cnt;
getans();
printf("%d\n",anslist[ans]);
}
return 0;
}
附书上解释:
【分析】
在《入门经典》一书中,我们曾提到过,解决“最小值最大”的常用方法是二分答案。假设答案为x,如何判断这个x是最小还是最大呢?删除品质因子小于x的所有配件,如果可以组装出一台不超过b元的电脑,那么标准答案ans≥x,否则ans<x。
如何判断是否可以组装出满足预算约束的电脑呢?很简单,每一类配件选择最便宜的一个即可。如果这样选都还超预算的话,就不可能有解了。代码如下。
【二分答案】 【POJ3497】 【Northwestern Europe 2007】 Assemble 组装电脑的更多相关文章
- 【二分答案】【POJ3122】【Northwestern Europe 2006】Pie
Pie Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10629 Accepted: 3744 Special Ju ...
- 【二分答案+贪心】解决“最小值最大”问题(UVa 12124 - Assemble)
Problem A - Assemble Time limit: 2 seconds Recently your team noticed that the computer you use to p ...
- UVA 12124 Assemble(二分答案)
题目链接:https://vjudge.net/problem/UVA-12124 垃圾vjudge毁我青春!! 首先这道题是解决“最小值最大”的问题,所以要二分答案. 在这里我们二分$quality ...
- [置顶] Ants(Northeastern Europe 2007)
Ants Time Limit: 5 ...
- 【二分答案】【哈希表】【字符串哈希】bzoj2946 [Poi2000]公共串
二分答案,然后搞出hash值扔到哈希表里.期望复杂度O(n*log(n)). <法一>next数组版哈希表 #include<cstdio> #include<cstri ...
- 二分答案:Poweroj2461-入门基础之二分答案(二分法的应用)
传送门:点击打开链接 入门基础之二分答案 Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 179 Accepted: 33 Page V ...
- CH Round #72树洞[二分答案 DFS&&BFS]
树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...
- [CF752E]Santa Claus and Tangerines(二分答案,dp)
题目链接:http://codeforces.com/contest/752/problem/E 题意:给n个橘子,每个橘子a(i)片,要分给k个人,问每个人最多分多少片.每个橘子每次对半分,偶数的话 ...
- [NOIP2011] 聪明的质检员(二分答案)
题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: 1 .给定m 个区间[L ...
随机推荐
- 关于vi不正常退出产生的swp文件
关于vi不正常退出产生的swp文件 非正常关闭vi编辑器时会生成一个.swp文件 关于swp文件 使用vi,经常可以看到swp这个文件,那这个文件是怎么产生的呢,当你打开一个文件,vi就会生成这么 ...
- 33c3-pwn350-tea
TEA 感觉这个题目出得很不错.先运行程序了解基本功能,程序可以读取对系统上存在的文件的内容,如果文件不存在的话,直接退出. 使用IDA打开后,发现父进程通过clone api克隆出一个子进程,主要的 ...
- Microsoft Visual C++ 不支持long long
Microsoft Visual C++ 不支持long long 在C/C++中,64为整型一直是一种没有确定规范的数据类型.现今主流的编译器中,对64为整型的支持也是标准不一,形态各异.一般来说, ...
- 【SQL学习笔记】排名开窗函数,聚合开窗函数(Over by)
处理一些分组后,该组按照某列排序后 ,取其中某条完整数据的问题. 或 按照其中不同列分组后的聚合 比如 sum,avg之类. MSDN上语法: Ranking Window Functions < ...
- 在后台操作标记的runat="server"的html标签
价格: <input id="tbPrice" type="text" runat="server" /> HtmlInputT ...
- Javascript进阶篇——浏览器对象—History对象
History 对象history对象记录了用户曾经浏览过的页面(URL),并可以实现浏览器前进与后退相似导航的功能.窗口被打开的那一刻开始记录,每个浏览器窗口.每个标签页乃至每个框架,都有自己的hi ...
- HTML 表单与输出
我们先来设置一个简单的表单 <!doctype html><html><head> <meta charset="utf-8"> & ...
- asp.net缓存(三)
Asp.net应用程序数据缓存 System.Web.Caching 命名空间提供用于缓存服务器上常用数据的类.此命名空间包括 Cache 类,该类是一个字典,您可以在其中存储任意数据对象,如哈希表和 ...
- iOS开发~视图(UIView)与控件(UIControl)
1.UIView类 1.什么是视图 看得见的都是视图 2.什么是控件 一种特殊的视图,都是UIControl的子类,不仅具有一定的显示外观,还能响应高级事件,与用户交互.严格意义上UILabel不是控 ...
- Objective C—创建单例
单例模式是在实际项目开发中用到比较多的一种设计模式,设计原理是整个系统只产生一个对象实例,通过一个统一的方法对外提供这个实例给外部使用. 在Java中,构造单例一般将类的构造函数声明为private类 ...