BZOJ2490 Zombie’s Treasure Chest

本文探讨了如何利用最大公约数(LCM)原理解决体积优化问题,通过数学技巧和枚举方法,实现效率提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果n = lcm(s1, s2),那么就可以直接得到maxV = (v / s1 * v1, v / s2 *v2)

然后还剩下一点体积我们暴力枚举用s1的量,让s1为max(s1, s2)可以减少枚举次数。。。然后就做完了QAQ

 

 1 /**************************************************************
 2     Problem: 2490
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:4 ms
 7     Memory:804 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <algorithm>
12  
13 using namespace std;
14 typedef long long ll;
15  
16 ll v, s1, s2, v1, v2;
17 ll ans, del;
18  
19 int main() {
20     int T, icase, i;
21     ll t, tmp;
22     scanf("%d", &T);
23     for (icase = 1; icase <= T; ++icase) {
24         scanf("%lld%lld%lld%lld%lld", &v, &s1, &v1, &s2, &v2);
25         if (s1 < s2) swap(s1, s2), swap(v1, v2);
26         tmp = s1 * s2 / __gcd(s1, s2), t = v / tmp;
27         v = v % tmp;
28         if (t) --t, v += tmp;
29         ans = max(t * (tmp / s1) * v1, t * (tmp / s2) * v2);
30         for (i = del = 0; i <= v / s1; ++i)
31             del = max(del, i * v1 + (v - i * s1) / s2 * v2);
32         printf("Case #%d: %lld\n", icase, ans + del);
33     }
34     return 0;
35 }
View Code

 

转载于:https://www.cnblogs.com/rausen/p/4360854.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值