题解:P15731 [JAG 2024 Summer Camp #2] Convenient Banknotes
分析
不妨设
显然就是
拓展到
设
-
枚举
i = 1\dots k-1 。将S 增加A\bmod D_{i} ,并将A 变成\lfloor\frac{A}{D_i}\rfloor 。 -
在枚举完
i 后,将S 增加A 。
考虑 DP。
定义状态函数
- 是情况
1 。代价(A\bmod D) + (B\bmod D)+(C\bmod D) + f(\lfloor\frac{A}{D}\rfloor,\lfloor\frac{B}{D}\rfloor,\lfloor\frac{C}{D}\rfloor) 。 - 是情况
2 。代价A+B+C 。
对于情况
时间复杂度
代码
unordered_map<int, int> f;
il int dfs(int a, int b, int c){
if(!(a + b + c)) return 0;
int Hs = a * 1000000000 + b * 1000000 + c;
if(f.count(Hs)) return f[Hs];
int spd = a + b + c;
for(re int d = 2; d <= max({a, b, c}); ){
int r = max({a, b, c});
if(a >= d) r = min(r, a / (a / d));
if(b >= d) r = min(r, b / (b / d));
if(c >= d) r = min(r, c / (c / d));
spd = min(spd, a + b + c - r * (a / d + b / d + c / d) + dfs(a / d, b / d, c / d));
d = r + 1;
}
return f[Hs] = spd;
}
il void solve(){
int a = rd, b = rd, c = rd;
cout << dfs(a, b, c) << "\n";
return ;
}