这题就把“空瓶换可乐”当成状态转移:先枚举初始买了多少瓶蜂蜜(剩下是生姜),然后一直兑换到不能换为止,取能喝最多的方案。
为了快一点,每次不是换一瓶,而是同一种能换多少就一次性全换,这样循环次数很少,整体基本就是 O(n)。
void solve(){
int n,a,b;cin>>n>>a>>b;
ll mx=0;
for(int i=0;i<=n;++i){
int h=i,g=n-i;
ll c=0;
while(h>=a||g>=b){
if(h>=a&&(g<b||a<=b)){
int t=h/a;
h-=t*a;
g+=t;
c+=t;
}else{
int t=g/b;
g-=t*b;
h+=t;
c+=t;
}
}
mx=max(mx,c);
}
cout<<n+mx<<endl;
}

京公网安备 11010502036488号