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;
}
posted @ 2024-10-21 11:28  lunjiahao  阅读(8)  评论(0编辑  收藏  举报