51nod——1548 欧姆诺姆和糖果

Posted noobimp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod——1548 欧姆诺姆和糖果相关的知识,希望对你有一定的参考价值。

  一开始以为是贪心,然后发现没法贪。暴力枚举肯定T,于是用约束关系优化:

  假设wr >= wb,

  第一种情况 wr >= sqrt (c), 则此时最多吃c / wr个r,且c / wr <= sqrt (c),这样从0到c / wr枚举r的数量即可。为什么不枚举b的数量,因为c/wr更小。这样就获得了一个n <= sqrt (1e9) 的O (n)解法。

  第二种情况wr < sqrt (c),设的wr >= wb自然 wb < sqrt (c),此时如果像上面那样枚举仍然会T,还能想办法再优化吗?比较一下两种糖的快乐重量比,保持r糖更快落(不然就互换值),即hr / wr >= hb / wb,则hr * wb >= hb * wr,这个式子说明了如果吃wr及以上个b,不如吃wb个r,所以从0到wr枚举b的数量即可。此时同样是n < sqrt (1e9) 的O (n)解法。

  

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 
 5 int main() {
 6     std::ios::sync_with_stdio (0);
 7     cin.tie (0);
 8     ll c, hr, hb, wr, wb, ans = 0;
 9     cin >> c >> hr >> hb >> wr >> wb;
10     if (wr < wb)
11         swap (wr, wb), swap (hr, hb);
12 
13     if (wr >= sqrt (c)) { //r最多取c/wr个
14         for (int i = 0; i * wr <= c; i++)
15             ans = max (ans, i * hr + (c - i * wr) / wb * hb);
16     } else { //wr、wb都小于sqrt(c)
17         if (1.0 * hr / wr < 1.0 * hb / wb) //保持r更优
18             swap (wr, wb), swap (hr, hb);
19 
20         for (int i = 0; i < wr; i++)
21             ans = max (ans, i * hb + (c - i * wb) / wr * hr);
22     }
23     cout << ans << endl;
24     return 0;
25 }

 

以上是关于51nod——1548 欧姆诺姆和糖果的主要内容,如果未能解决你的问题,请参考以下文章

1548 欧姆诺姆和糖果 分类暴力 + 数学

51nod 1554:欧姆诺姆和项链——题解

51Nod 1554 欧姆诺姆和项链 (KMP)

小智的糖果(Candy) 51nod 提高组试题

51nod 1307:绳子与重物

51nod1671