SP9685 ZTC - Zombie’s Treasure Chest 题解
简单题。
对于空间大小为 \(s1 \times s2\) 时,显然最多可得到的价值为 \(\max(s2 \times v1,s1 \times v2)\),剩下小于 \(s1 \times s2\) 的部分选一个占用空间大的枚举就好。
时间复杂度:\(O(T \lfloor \frac{m}{\max(s1,s2)} \rfloor)\),其中 \(m = n \bmod (s1 \times s2)\)。
数据范围较大,建议开 long long
。
Talk is cheap,show me you code.
#include<bits/stdc++.h>
#define il inline
#define swap(a,b) (a^=b^=a^=b)
#define max(a,b) (a>b?a:b)
#define int long long
using namespace std;
il int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48),ch=getchar();}
return x*f;
}
void solve(int idx)
{
int n=read(),s1=read(),v1=read(),s2=read(),v2=read();
int res=n/(s1*s2)*max(s2*v1,s1*v2),ans=0;
n%=s1*s2;
if(s1<s2) swap(s1,s2),swap(v1,v2);
for(int i=0;i*s1<=n;i++) ans=max(ans,i*v1+(n-i*s1)/s2*v2);
printf("Case #%lld: %lld\n",idx,res+ans);
}
signed main()
{
int T=read();
for(int i=1;i<=T;i++) solve(i);
return 0;
}