hdu 4091 Zombie’s Treasure Chest(数学规律+枚举)

时间:2023-03-08 19:38:24

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4091

/** 这题的一种思路就是枚举了:
基于这样一个事实:求出lcm = lcm(s1,s2), num1 = lcm/s1, num2 = lcm/s2; 则价值与体积比小的那个宝藏个数一定大于lcm/size;这个用反证法就可证明。
然后就是只需要枚举N%lcm + lcm这个体积的最有分配。 */ #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; long long N,s1,v1,s2,v2;
long long ans; long long gcd(long long a,long long b)
{
if(a < b) swap(a,b);
if(b == ) return a;
return gcd(b,a%b);
} int main()
{
//freopen("E:\\acm\\input.txt","r",stdin); int T;
cin>>T; for(int cas=; cas<=T; cas++)
{
ans = ;
scanf("%I64d %I64d %I64d %I64d %I64d",&N,&s1,&v1,&s2,&v2); if(v1*s2 < v2*s1)
{
swap(v1,v2);
swap(s1,s2);
} long long lcm = s1*s2/gcd(s1,s2);
long long res = N%lcm+lcm;
ans = (N-res)/s1 * v1; if(N <= lcm)
{
ans = ;
res = N;
} //特殊情况,就特殊处理下 int lim = res/max(s1,s2);
long long temp = ;
for(int i=; i<=lim; i++)
{
int k = (res-i*s1)/s2;
temp = max(temp,i*v1+k*v2);
k = (res-i*s2)/s1;
temp = max(temp,i*v2+k*v1);
} printf("Case #%d: %I64d\n",cas,ans+temp);
}
}