(暴力)UVA - 12325 Editing a Book

题意:有一个容量为n的背包,有两种宝物,体积分别为S1,S2;价值为V1,V2。这两种宝物有无数种,现在向背包中塞宝物,问最多能装多少价值。



分析:可以很容易想到这个代码

for (int i = 0; i <= n / max(s1,s2); i++) {
            tmp = i * v1;
            ans = max(ans, tmp + ((n - i * s1) / s2) * v2);
}

但是,如果max(s1,s2)很小的话,就会瞬间爆炸。

比如n有1073741824,但是max(s1,s2)==2,循环就到了亿级。

所以可以在考虑max(s1,s2)比较小的时候换一种暴力的方式。

直接考虑两种宝物性价比哪个高,暴力那个性价比高的即可。

if (s1 <= 100000) {
    if (s1 * v2 > s2 * v1) //第二个宝物性价比第一个宝物高    {
        for (int i = 0; i < s2; i++) {
            tmp = i * v1;
            ans = max(ans, tmp + ((n - i * s1) / s2) * v2);
        }
    } else
        for (int i = 0; i < s1; i++) {
            tmp = i * v2;
            ans = max(ans, tmp + ((n - i * s2) / s1) * v1);
        }
    }

}

第二个宝物性价比比第一个宝物高时:

其实就是遍历取第一种宝物数量的暴力,可能取0个、1个、2个....s2-1个,这是未知的,所以需要通过暴力跑出来。

为什么不需要s2个,因为如果第一种取s2个,因为第二个宝物的性价比比第一个宝物高,所以取s2个第一宝物还不如取s1个第二宝物。

反之类似。



代码:

 1 #include <set>
 2 #include <map>
 3 #include <list>
 4 #include <cmath>
 5 #include <queue>
 6 #include <vector>
 7 #include <bitset>
 8 #include <string>
 9 #include <cctype>
10 #include <cstdio>
11 #include <cstring>
12 #include <cstdlib>
13 #include <iostream>
14 #include <algorithm>
15
16 using namespace std;
17
18 typedef long long ll;
19 typedef unsigned long long ull;
20 #define inf (0x3f3f3f3f)
21 #define lnf (0x3f3f3f3f3f3f3f3f)
22 #define eps (1e-8)
23 int sgn(double a) {return a < -eps ? -1 : a < eps ? 0 : 1;}
24
25 //--------------------------
26
27
28
29 int t;
30 ll s1, v1, s2, v2;
31 ll n;
32
33 void solve() {
34     scanf("%d", &t);
35     int s = 0;
36     while (t--) {
37         scanf("%lld%lld%lld%lld%lld", &n, &s1, &v1, &s2, &v2);
38         if (s1 < s2) {
39             swap(s1, s2);
40             swap(v1, v2);
41         }
42         ll tmp;
43         ll ans = 0;
44         if (s1 <= 100000) {
45             if (s1 * v2 > s2 * v1) {
46                 for (int i = 0; i < s2; i++) {
47                     tmp = i * v1;
48                     ans = max(ans, tmp + ((n - i * s1) / s2) * v2);
49                 }
50             } else {
51                 for (int i = 0; i < s1; i++) {
52                     tmp = i * v2;
53                     ans = max(ans, tmp + ((n - i * s2) / s1) * v1);
54                 }
55             }
56             printf("Case #%d: %lld\n", ++s, ans );
57             continue;
58         }
59         for (int i = 0; i <= n / s1; i++) {
60             tmp = i * v1;
61             ans = max(ans, tmp + ((n - i * s1) / s2) * v2);
62         }
63         printf("Case #%d: %lld\n", ++s, ans );
64     }
65
66 }
67
68
69
70 int main() {
71
72 #ifndef ONLINE_JUDGE
73     freopen("1.in", "r", stdin);
74     freopen("1.out", "w", stdout);
75 #endif
76     //iostream::sync_with_stdio(false);
77     solve();
78     return 0;
79 }
时间: 2025-01-02 02:45:17

(暴力)UVA - 12325 Editing a Book的相关文章

UVa 12325 Zombie&#39;s Treasure Chest【暴力】

题意:和上次的cf的ZeptoLab的C一样,是紫书的例题7-11 不过在uva上交的时候,用%I64d交的话是wa,直接cout就好了 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include&l

UVA 12325 Zombie&#39;sTreasureChest

看上去非常像背包的问题,但是体积太大了. 线性规划的知识,枚举附近点就行了,优先选性价比高的, 宝物有两种体积为S0,价值V0,体积S1,价值V1. 枚举分以下几种: 1:枚举拿宝物1的数量,然后尽量多拿宝物2:O(N/S0) 2:枚举拿宝物2的数量,同上:O(N/S1) 3.贪心,尽量选性价比高的 令gcd(S0,S1)= t,S1/t*S0 = S0/t*S1:体积相同的情况下尽量选价值高的,如果S1*V0>S0*V1大,那么枚举拿宝物2的数量,最多S0/t-1个否则一定可以换成S1/t个宝

uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索

迭代加深搜索 自己看的时候第一遍更本就看不懂..是很水,但智商捉急也是没有办法的事情. 好在有几个同学已经是做过了这道题并且对迭代加深搜索的思路有了一定的了解,所以在某些不理解的地方询问了一下他们的见解, 真的是很有帮助,也许自己想要想很久才能想明白,还会很痛苦,稍微问一下别人的想法,点上一个方向,剩下的自己就能想得明白了. 迭代加深. 把answer(需要的步数或其他)在主函数里面从零往上递加,此之谓 "层数",亦可谓之"深度".用书上的话就是: 从小到大枚举深度

[2016-02-27][UVA][11212][Editing a Book]

[2016-02-27][UVA][11212][Editing a Book] 时间:2016-02-26 19:38:44 星期五 题目编号:UVA 11212 题目大意:给定长度为n(值为1~n)的序列,求把该序列 复制/粘贴 成1~n 的排列最少步数 分析: 状态空间搜索,但是每次状态转移的方式有多种,可能会T, 发现,最多 操作 的次数:n~1的序列,每次操作 长度为1的连续段,那么需要 n-1 次操作 可以用IDA*算法 剪枝,每次操作之后,每个数字的后继数字不正确的数目h,最多减少

UVa 12325 - Zombie&#39;s Treasure Chest-[分类枚举]

12325 Zombie’s Treasure Chest Some brave warriors come to a lost village. They are very lucky and find a lot of treasures and a big treasure chest, but with angry zombies. The warriors are so brave that they decide to defeat the zombies and then brin

【例题 7-11 UVA - 12325】Zombie&#39;s Treasure Chest

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 1.N/s1 < 1e6 枚举1的个数 2.N/s2<1e6 枚举2的个数 3.s1和s2的值较小 假设买了s2个1和s1个2 那么这两种物品占的体积就一样大了. 即都为s1s2 而第一种物品价值为s2v1第二种物品价值为s1v2 那么 如果s2v1>s1v2的话. 可以想见,如果第二种物品的数量超过了s1的话,显然可以把它占的体积都用来买物品1,因为那样更优. 则我们第二种物品最多只要枚举到s1就可以了. 同理s2v1

uva 12325 枚举暴力 b

Some brave warriors come to a lost village. They are very lucky and find a lot of treasures and a big treasure chest, but with angry zombies. The warriors are so brave that they decide to defeat the zombies and then bring all the treasures back. A br

UVa 12325 宝箱

https://vjudge.net/problem/UVA-12325 题意:有一个体积为N的箱子和两种数量无限的宝物.宝物1的体积为S1,价值为V1'宝物2的体积为S2,价值为V2.计算出最多能装多大价值的宝物. 思路:题目很清楚就是暴力枚举,但是如果不简化枚举的话肯定是会超时的,如果N/S1比较小,那就枚举宝物1的个数,如果N/S2比较小,则枚举宝物2的个数.还有一种情况就是S1和S2都很小,S2个宝物1和S1个宝物2的体积相等,而价值分别为S2*V1和S1*V2.如果前者比较大,则宝物2

UVA 11212 Editing a Book [迭代加深搜索IDA*]

11212 Editing a Book You have n equal-length paragraphs numbered 1 to n. Now you want to arrange them in the order of 1, 2, . . . , n. With the help of a clipboard, you can easily do this: Ctrl-X (cut) and Ctrl-V (paste) several times. You cannot cut