zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    CocoaPods
    第一篇 理论 1.7 精进-正念-正知,如理作意和觉察力
    构架稳定与可扩展的优惠券系统
    一个产品从0到1的过程
    实现实时定位
    征信比拼重点是数据和连接
    黑产
    爬虫有什么用
    爬虫应用
    甘蔗理论
  • 原文地址:https://www.cnblogs.com/noobimp/p/10901541.html
Copyright © 2011-2022 走看看