若s1>sqrt(n),直接枚举1,2亦然。当s1,s2<=sqrt(n),若v1/s1>v2/s2,及1的性价比更高,对于s1*s2的空间,肯定选1放,所以最后剩下的只有n%(s1*s2),这些空间就用来放2。很有道理然而我并不知道为什么错了。
标解的做法是假设1性价比高的情况下,买了t1个1,t2个2,假如t2>s1 => t2*s2>s1*s2 ,而s1*s2肯定是买s2个1比较划算,所以t2一定<=s1,直接枚举就好了。
#include<cstdio>
#include<cstring>
#include<cmath>
long long n,s1,v1,s2,v2;
long long upline;
long long ans;
int main()
{
long long t;
scanf("%lld",&t);
for(long long i=1;i<=t;i++)
{
ans=0;
scanf("%lld%lld%lld%lld%lld",&n,&s1,&v1,&s2,&v2);
upline=ceil(sqrt(1.0*n));
if(s1>=upline)
{
long long l=0,tmp;
while(s1*l<=n)
{
tmp=v1*l+(n-s1*l)/s2*v2;
if(tmp>ans)
ans=tmp;
l++;
}
}
else if(s2>=upline)
{
long long l=0;long long tmp;
while(s2*l<=n)
{
tmp=v2*l+(n-s2*l)/s1*v1;
if(tmp>ans)
ans=tmp;
l++;
}
}
else
{
long long tmp;
if(v1*s2>v2*s1) //1 good
{
for(long long l=0;l<=s1;l++)
if(n-l*s2>0)
{
tmp=v2*l+(n-l*s2)/s1*v1;
if(tmp>ans)
ans=tmp;
}
}
else // 2 good
{
for(long long l=0;l<=s2;l++)
if(n-l*s1>0)
{
tmp=v1*l+(n-l*s1)/s2*v2;
if(tmp>ans)
ans=tmp;
}
}
}
printf("Case #%lld: %lld\n",i,ans);
}
return 0;
}