码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-05-21 19:22:44      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:糖果   else   nbsp   sync   1.0   efi   一个   color   names   

  一开始以为是贪心,然后发现没法贪。暴力枚举肯定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 欧姆诺姆和糖果

标签:糖果   else   nbsp   sync   1.0   efi   一个   color   names   

原文地址:https://www.cnblogs.com/noobimp/p/10901541.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!