uvalive 3971 Assemble

https://vjudge.net/problem/UVALive-3971

题意:

现在你要组装一台电脑,每个电脑的一种类型的配件都有多种选择,它们的名字是不同的。

现在给出已有的元件,每种类型都至少有一个元件。你有已知的预算,要求你找出以不超过预算的钱,每种类型的元件恰好选择一个,最低质量的元件的质量要尽量高,输出这个最高值。

思路:

从题意的叙述来看,最大化最小值,那么肯定是选用二分。

二分选择的量应该是质量。

接下来证明花费的钱是随着质量非递减的。

设当前的最小质量为x,那么把所有元件中质量小于x的全部删除,在剩下元件中,每一类型选择价钱最少的。

当x增加:

1.选择的价钱最少的恰好是质量最小的,那么此时质量选更大的话,价格的总和就有可能变大(会有重复的价格);

2.选择的价钱最少的不是质量最小的,那么当质量更大的话,选择的还是这个元件,价钱不会增加。

所以,当x逐渐增大的时候,价钱非递减,满足而二分的条件。

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <string>
 4 #include <map>
 5 #include <vector>
 6 using namespace std;
 7
 8 struct node
 9 {
10     long long p,q;
11 };
12
13 int cnt = 0;
14 vector<node> v[1005];
15 int n;
16 long long b;
17 map<string,int> mmp;
18
19 bool meet(long long k)
20 {
21     long long sum = 0;
22
23     for (int i = 1;i <= cnt;i++)
24     {
25         long long minn = 1e15;
26
27         for (int j = 0;j < v[i].size();j++)
28         {
29             if (v[i][j].q >= k)
30             {
31                 if (v[i][j].p < minn)
32                 {
33                     minn = v[i][j].p;
34                 }
35             }
36         }
37
38         sum += minn;
39     }
40
41     return sum <= b;
42 }
43
44 int main()
45 {
46     int t;
47
48     scanf("%d",&t);
49
50     while (t--)
51     {
52         scanf("%d%lld",&n,&b);
53
54         for (int i = 0;i <= n;i++) v[i].clear();
55
56         mmp.clear();
57
58         cnt = 0;
59
60         for (int i = 0;i < n;i++)
61         {
62             char s1[25],s2[25];
63             long long p,q;
64
65             scanf("%s%s%lld%lld",s1,s2,&p,&q);
66
67             if (mmp[s1])
68             {
69                 v[mmp[s1]].push_back(node{p,q});
70             }
71             else
72             {
73                 mmp[s1] = ++cnt;
74                 v[cnt].push_back(node{p,q});
75             }
76         }
77
78         long long l = 0,r = 1e11;
79
80         while (r > l + 1)
81         {
82             long long mid = (l + r) >> 1;
83
84             if (meet(mid)) l = mid;
85             else r = mid;
86         }
87
88         while (meet(l+1)) l++;
89
90         printf("%lld\n",l);
91     }
92
93     return 0;
94 }
时间: 2024-11-15 07:38:39

uvalive 3971 Assemble的相关文章

[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

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

UVALive 3971 组装电脑

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1972 http://7xjob4.com1.z0.glb.clouddn.com/df5832a56667ea3317ca9166994f1eb6 题意:给电脑配件,价格和性能,求在指定总价内配件的最低性能最大. 思路:用二分方法,找出性能,使这个性能以上的配件能在指定价格内

LA 3971 (二分) Assemble

题意: 你有b块钱想要组装一台电脑.给出n个配件的种类,品质和价格,要求每个种类的配件各买一个总价格不超过b且“品质最差配件”的品质因子应尽量大. 这种情况下STL的map的确很好用,学习学习 这种最大值最小的问题可以用二分法,自己写的二分会死循环,学习一下别人的二分. 1 //#define LOCAL 2 #include <vector> 3 #include <cstdio> 4 #include <string> 5 #include <map>

live archive 3971

/**  * @brief live archive 3971  * @file 3971.cpp  * @author mianma  * @created 2014/12/22 16:23  * @edited  2014/12/22 16:23  * @type binart_search  * @note  * @cost time n*log(MAXQ)  * @cost mem  MAXN*sizeof(struct compent)  */ #include <fstream>

UVALive 4848 Tour Belt

F - Tour Belt Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVALive 4848 Description Korea has many tourist attractions. One of them is an archipelago (Dadohae in Korean), a cluster of small islands sca

UVALive 6467 Strahler Order 拓扑排序

这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ 以后能用CIN还是CIN吧 QAQ 贴代码了: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostre