C. Om Nom and Candies 巧妙优化枚举,将复杂度控制在10e6

                                    C. Om Nom and Candies

无线超大背包问题

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <string>
 7 #include <vector>
 8 #include <set>
 9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF=0x4fffffff;
17 const int EXP=1e-5;
18 const int MS=12;
19 const LL SIZE=1000;
20
21 int main()
22 {
23       LL c,hr,hb,wr,wb;
24       cin>>c>>hr>>hb>>wr>>wb;
25       if(wb>wr)
26       {
27             swap(wb,wr);
28             swap(hb,hr);
29       }
30
31       if(wr>SIZE)        //  巧妙将 复杂度控制在  10e6
32       {
33             LL ans=0LL;
34             for(LL r=0;r*wr<=c;r++)
35             {
36                   LL b=(c-r*wr)/wb;
37                   LL cur=r*hr+b*hb;
38                   if(cur>ans)
39                         ans=cur;
40             }
41             cout<<ans<<endl;
42             return 0;
43       }
44       LL ans=0;
45       LL h_big=max(wb*hr,wr*hb);
46       for(LL r=0;r<wb;r++)    //  如果r>=wb,可以组成一个公倍数重量的big
47       {
48             for(LL b=0;b<wr;b++)   // 同理
49             {
50                   LL w=r*wr+b*wb;
51                   if(w>c)
52                         break;
53                   LL big=(c-w)/(wr*wb);
54                   LL cur=r*hr+b*hb+big*h_big;
55                   if(cur>ans)
56                         ans=cur;
57             }
58       }
59       cout<<ans<<endl;
60       return 0;
61 }

    HDU 换了一个背景的同题      Zombie’s Treasure Chest

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <string>
 7 #include <vector>
 8 #include <set>
 9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF=0x4fffffff;
17 const int EXP=1e-5;
18 const int MS=12;
19 const LL SIZE=1000;
20
21 int main()
22 {
23       int T,kase=1;
24       scanf("%d",&T);
25       while(T--)
26       {
27             LL c,hr,hb,wr,wb;
28             //cin>>c>>hr>>hb>>wr>>wb;
29             cin>>c>>wr>>hr>>wb>>hb;
30             if(wb>wr)
31             {
32                   swap(wb,wr);
33                   swap(hb,hr);
34             }
35
36             if(wr>SIZE)        //  巧妙将 复杂度控制在  10e6
37             {
38                   LL ans=0LL;
39                   for(LL r=0;r*wr<=c;r++)
40                   {
41                         LL b=(c-r*wr)/wb;
42                         LL cur=r*hr+b*hb;
43                         if(cur>ans)
44                               ans=cur;
45                   }
46                   cout<<"Case #"<<kase++<<": "<<ans<<endl;
47                   continue;
48             }
49             LL ans=0;
50             LL h_big=max(wb*hr,wr*hb);
51             for(LL r=0;r<wb;r++)    //  如果r>=wb,可以组成一个公倍数重量的big
52             {
53                   for(LL b=0;b<wr;b++)   // 同理
54                   {
55                         LL w=r*wr+b*wb;
56                         if(w>c)
57                               break;
58                         LL big=(c-w)/(wr*wb);
59                         LL cur=r*hr+b*hb+big*h_big;
60                         if(cur>ans)
61                               ans=cur;
62                   }
63             }
64             cout<<"Case #"<<kase++<<": "<<ans<<endl;
65       }
66       return 0;
67 }
时间: 2024-12-09 21:20:46

C. Om Nom and Candies 巧妙优化枚举,将复杂度控制在10e6的相关文章

ZeptoLab Code Rush 2015 C. Om Nom and Candies 暴力

C. Om Nom and Candies Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/526/problem/C Description A sweet little monster Om Nom loves candies very much. One day he found himself in a rather tricky situation that required him

Codeforces C - Om Nom and Candies

C - Om Nom and Candies 思路:贪心+思维(或者叫数学).假设最大值max(wr,wb)为wr,当c/wr小于√c时,可以枚举r糖的数量(从0到c/wr),更新答案,复杂度√c:否则,假设hr/wr<hb/wr,得到hr*wb<hb*wr,由这个等式可知,在有wb*wr重量限制的情况下,买wb个r糖没有买wr个b糖划算,当需要买超过wb个r糖时,不如去买b糖,可以枚举r糖的数量(从0到wb-1),更新答案,复杂度√c. 代码: #include<bits/stdc++

Codeforces 526C - Om Nom and Candies

A sweet little monster Om Nom loves candies very much. One day he found himself in a rather tricky situation that required him to think a bit in order to enjoy candies the most. Would you succeed with the same task if you were on his place? One day,

Codeforces 525C Om Nom and Candies 枚举 + 复杂度分析

题意:给你无穷多的A,B物品,现在你有承重C的背包,给你A,B物品的价值和重量,问你如何取使得价值最大. 解题思路:很巧秒的枚举. 解题代码: 1 // File Name: c.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月05日 星期日 01时16分14秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set>

Codeforces 526C - Om Nom and Candies(贪心,暴力)

题意:你最多可以吃C千克的糖,   有两种糖,每种糖有两个参数,一个为重 w  ,一个为欢乐度 h , 如何选择才能拥有最高的欢乐度,  两种糖数量不限. 题解:看了半天题解才理解如何做, 分为两种枚举政策涵盖了所有情况, 时间复杂度为sqrt(c),神奇的暴力 1.如果两种糖中重量最大的超过sqrt(c),  那么该糖最多也只能选择不超过sqrt(c)个,   直接枚举该糖个数,记录最大欢乐度 2.如果两种糖重量都小于sqrt(c),那么从性价比来考虑 我们可以买到Wb个a糖果的同时也可以将其

ZeptoLab Code Rush 2015 C. Om Nom and Candies

1.题目描述:点击打开链接 2.解题思路:本题是无限背包问题,根据重量的约束关系,直接暴力搜索. 3.代码: #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<string> #include<sstream> #include<set> #include<vector> #include<stack> #incl

【Henu ACM Round#19 E】 Om Nom and Candies

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 紫书上的原题: 链接 [代码] #include <bits/stdc++.h> #define ll long long using namespace std; const int N = 1e5; ll m,c1,c2,v1,v2; int main() { #ifdef LOCAL_DEFINE freopen("rush_in.txt","r",stdin); #endif i

ZeptoLab Code Rush 2015 B. Om Nom and Dark Park DFS

B. Om Nom and Dark Park Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/526/problem/B Description Om Nom is the main character of a game "Cut the Rope". He is a bright little monster who likes visiting friends living a

B. Om Nom and Dark Park

B. Om Nom and Dark Park 在满二叉树上的某些边上添加一些值.使得根节点到叶子节点的路径上的权值和都相等.求最少需要添加多少. 我们利用性质解题.   考察兄弟节点.由于他们从跟节点到父节点这路径是相同的,所以需要添加的值为  2*max(lch,rch)-lch-rch;  同时将max(lch,rch)累加到父节点. 思路是最重要的.有时候不是聪不聪明的问题,而是会不会思考的问题. 1 #include <iostream> 2 #include <cstdio&