LA 3971 (二分) Assemble

题意:

你有b块钱想要组装一台电脑。给出n个配件的种类,品质和价格,要求每个种类的配件各买一个总价格不超过b且“品质最差配件”的品质因子应尽量大。

这种情况下STL的map的确很好用,学习学习

这种最大值最小的问题可以用二分法,自己写的二分会死循环,学习一下别人的二分。

 1 //#define LOCAL
 2 #include <vector>
 3 #include <cstdio>
 4 #include <string>
 5 #include <map>
 6 using namespace std;
 7
 8 int cnt;    //组件的类型数
 9 map<string, int> id;    //将组件类型的名字与编号对应起来
10 int ID(string s)    //求类型s的编号
11 {
12     if(!id.count(s))    id[s] = cnt++;
13     return id[s];
14 }
15 const int maxn = 1000 + 5;
16 struct Component
17 {
18     int price;
19     int quality;
20 };
21 int n, b;
22 vector<Component> comp[maxn];
23
24 bool ok(int q)
25 {//品质不小于q的组件能否组成不超过b元的电脑
26     int sum = 0;
27     for(int i = 0; i < cnt; ++i)
28     {
29         int cheapest = b + 1, m = comp[i].size();
30         for(int j = 0; j < m; ++j)
31             if(comp[i][j].quality >= q)
32                 cheapest = min(cheapest, comp[i][j].price);
33                 //选择品质因子不小于p的最便宜的配件
34         if(cheapest > b)    return false;
35         sum += cheapest;
36         if(sum > b)    return false;
37     }
38     return true;
39 }
40
41 int main(void)
42 {
43     #ifdef LOCAL
44         freopen("3971in.txt", "r", stdin);
45     #endif
46
47     int T;
48     scanf("%d", &T);
49     while(T--)
50     {
51         scanf("%d%d", &n, &b);
52         cnt = 0;
53         for(int i = 0; i < n; ++i)    comp[i].clear();
54         id.clear();
55
56         int maxq = 0;
57         for(int i = 0; i < n; ++i)
58         {
59             char type[30], name[30];
60             int p, q;
61             scanf("%s%s%d%d", type, name, &p, &q);
62             maxq = max(maxq, q);
63             comp[ID(type)].push_back((Component) {p, q});
64         }
65
66         int L = 0, R = maxq;
67         while(L < R)
68         {
69             int M = L + (R - L + 1) / 2;
70             if(ok(M))
71                 L = M;
72             else
73                 R = M - 1;
74         }
75         printf("%d\n", L);
76     }
77     return 0;
78 }

代码君

时间: 2024-10-29 19:06:42

LA 3971 (二分) Assemble的相关文章

LA 3126 二分匹配---DAG中的最小路径应用

题意:有 n 个顾客 , 需要坐出租车从一个地方去另一个地方 , 每个顾客的出发时间.出发地点.目的地点都已给出 , 从出发地点到目的地点的时间为两地之间的路径长度 , 并且出租车要比顾客的出发时间早一分钟到达 , 问最少需要派出多少辆出租车. 解法:我们先这样来构图 , 每个顾客是一个结点,如果同一个出租车在接完客人 u 之后还来得及节客人 v , 那么就在 u 到 v 之间连一条有向边 . 由此可以发现 , 这个图是一个DAG , 那么我们就只需要找最小路径覆盖(最小路径覆盖:是指在图中找尽

LA 3971 组装电脑(二分)

https://vjudge.net/problem/UVALive-3971 题意:你有b块钱,想要组装一台电脑.给出n个配件各自的种类.品质因子和价格,要求每种类型的配件各买一个,总价格不超过b,且“品质最差配件”的品质因子应尽量大. 思路: 最小值最大,很明显要二分. 那么怎么判断这个品质因子下钱是够用的呢? 对于每个类型的配件来说,买最便宜的复合品质因子的配件,如果这样都大于b,那就得减小品质因子了. 1 #include<iostream> 2 #include<algorit

LA 4725 (二分) Airport

题意: 有W.E两个跑道,在每个时刻每个跑道的飞机都从0开始编号,而且每个时刻都有Wi和Ei架飞机到达这两个跑道.而且每个时刻只能选择一个跑道的一架飞机起飞.问如何选择才能使得飞机的最大编号最小.(每个时刻算编号时是在飞机起飞之前的) 思路: 又是一个最大值最小的问题,可以用二分,不过怎么二分我没有想到. 参考的别人的代码:http://blog.csdn.net/u011345136/article/details/17793415 起飞的决策是这样的: 如果一条跑道是空的,另一条跑道有飞机,

6.12白书第五章图论总结——司雨寒

之前我的图论一直都是DFS一下,BFS一下,求个欧拉回路,拓扑排个序这种渣渣水平. 终于鼓起勇气拾起白书第五章的东西. 学(bei)习(song)了一下求双连通分量,二分图的判定,强连通分量,2-SAT. DFS加上时间戳这个东西,很强大. 最后刷了白书上的例题: BCC: LA3523 可以参加会议的是双联通分量上的奇圈 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include

UVA 12124 UVAlive 3971 Assemble(二分 + 贪心)

先从中找出性能最好的那个数, 在用钱比较少的去组合,能组出来就表明答案在mid的右边,反之在左边, #include<string.h> #include<map> #include<stdio.h> #include<iostream> #include<algorithm> using namespace std; map<string,int> vic;//以字符映射数字 int end,start; int num; int

UVALive 3971 Assemble(模拟 + 二分)

UVALive 3971 题意:有b块钱,想要组装一台电脑,给出n个配件的种类,名字,价格,品质因子.若各种类配件各买一个,总价格<=b,求最差品质配件的最大品质因子. 思路: 求最大的最小值一般用二分法. 在(0,maxq)内进行二分,判定q作为最差品质因子是否可行. 大白书原题,比较考验代码功底. code: /* * @author Novicer * language : C++/C */ #include<iostream> #include<sstream> #i

UVALive 3971 Assemble(二分+贪心)

本题思路不难,但是要快速准确的AC有点儿考验代码功力. 看了大白书上的标程,大有所获. 用map和vector的结合给输入分组,这个数据结构的使用非常精美,恰到好处. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include&l

[2016-03-19][UVALive][3971][Assemble]

时间:2016-03-19 13:55:17 星期六 题目编号:[2016-03-19][UVALive][3971][Assemble] 题目大意:给定若干个电脑零件的价格和质量,求在总价不超过b的情况下,品质最差的配件的质量尽可能大 分析:二分 #include <vector> #include <map> #include <algorithm> #include <string> #include <cstring> #include

Hdoj 2333 Assemble 【二分】

Assemble Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 479    Accepted Submission(s): 169 Problem Description Recently your team noticed that the computer you use to practice for programming