一开始以为是贪心,然后发现没法贪。暴力枚举肯定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 }
原文地址:https://www.cnblogs.com/noobimp/p/10901541.html
时间: 2024-10-14 11:32:40