首先考虑到最少费用就能拿到的一些价值
1.若最后第二位为a 那么最后一位为b 只需要花费一个b就能拿到一个价值 (因为b会受到C影响所以考虑b)
2.对于规则3来说 bbbabbba如此切换是最优的
3.对于规则1.2来说 把数放在一个地方 第一次产生价值需要a/b 第二次以后产生价值只需要 a-1/b-1
带着这三个目标去求的最优解
大家可以看到 对于规则 1 2来说 我们只需要在 规则3 的情况下 进行一个填充就行了 所以我们可以考虑 枚举 这种切换 切换了多少次 : 我们通过数据发现 我们枚举是完全一个可行的复杂度
枚举切换多少次后我们就对于上述所说的3个最少费用拿最多价值进行一个贪心的处理
假定我们切换的 方式就是 bbbabbba
那么对于 a首先有个处理 那么就是 在 bbbabbba的形式前面 只需要花费一个a就可以拿到一个价值
再其次进行一个a的填充 填充有两种方向: 一种是只在一个地方填充 一种是把我们切换已有的地方进行一个填充 这两次填充需要进行一个比较
对于b有一个处理就是如果倒数第二位是个a的话 那么最后一个只需要花费一个b就能拿到一个价值
然后再进行一个填充即可
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >> t;
//bbbbabbbba
while(t--){
int n,m,a,b,c;
cin >> n >> m >> a >> b >> c;
int maxn = 0;
for(int i = 0; i <= min(n,m / c); i++){
int sum = 0;
if(i == 0){
sum++;
sum += (n - 1) / a;
sum += (m - 1) / b;
}else{
sum++;
sum += (i - 1) * 2;
if(n - i >= 1){
sum++;
int x = n - i - 1;
sum += x / a;
}
if(c > b){
sum += (c - 1) / b * i;
}
if(m - c * i >= 1){
sum++;
int x = m - i * c - 1;
int mod = (((c - 1) / b + 1) * b) - (c - 1);
if(x / mod >= i) sum += i,x -= mod * i;
else{
sum += x / mod;
x -= x / mod * mod;
}
sum += x / b;
}
}
cout << i << " " << sum << endl;
maxn = max(maxn,sum);
}
cout << maxn + 1 << endl;
}
return 0;
}