B - Make N
https://atcoder.jp/contests/arc139/tasks/arc139_b
三个操作的单价分别为:
X
1
,
Y
A
,
Z
B
\frac{X}{1},\frac{Y}{A},\frac{Z}{B}
1X?,AY?,BZ? ,如果操作
1
1
1 的单价最低肯定直接只用操作
1
1
1 ,若操作
1
1
1 的单价是第二低,那么肯定是先一直用单价最低的,然后最后剩下没处理完的用操作
1
1
1 。那么现在主要就是讨论如果操作
2
,
3
2,3
2,3 的单价都比
1
1
1 低的情况:
首先我们这里假设操作
2
2
2 的单价最低,那么操作
2
2
2 可能使用的操作次数上界是
?
N
A
?
\lfloor \frac{N}{A} \rfloor
?AN?? (再多用一次总值就会超过
N
N
N ),操作
3
3
3 的操作次数上界是
A
?
1
A-1
A?1 (若大于等于
A
A
A ,能整除
A
A
A 的部分都可以用操作
2
2
2 代替)。那么我们现在考虑枚举上界更小操作,然后分析一下复杂度。
若
?
N
A
?
<
A
?
1
\lfloor \frac{N}{A} \rfloor < A-1
?AN??<A?1 ,即操作
2
2
2 的上界更小,那么我们会发现此时
A
A
A 最小也是
N
\sqrt N
N
? 级别的,所以
?
N
A
?
\lfloor \frac{N}{A} \rfloor
?AN?? 最大也就是
N
\sqrt N
N
? 级别,可以枚举操作
2
2
2 的使用次数。
若
A
?
1
≤
?
N
A
?
A-1 \leq \lfloor \frac{N}{A} \rfloor
A?1≤?AN?? ,即操作
3
3
3 的上界更小,那么此时
A
A
A 最大也只是
N
\sqrt N
N
? 级别,所以
A
?
1
A-1
A?1 最大也只是
N
\sqrt N
N
? 级别的,可以枚举操作
3
3
3 使用的次数。
所以综上,时间复杂度即为
O
(
T
N
)
O(T\sqrt N)
O(TN
?)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll N, A, B, X, Y, Z;
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int T; scanf("%d", &T);
while(T--) {
cin >> N >> A >> B >> X >> Y >> Z;
if (Y * B > A * Z) {
swap(A, B);
swap(Y, Z);
}
if (X * A <= Y) {
printf("%lld\n", N * X);
}
else if (X * B <= Z) {
printf("%lld\n", N / A * Y + N % A * X);
}
else {
ll ans = 1e18;
if (N / A < A - 1) {
for (int i = 0; i <= N / A; ++i) {
ll n = N - i * A;
ans = min(ans, i * Y + n / B * Z + n % B * X);
}
}
else {
for (int i = 0; i <= A - 1; ++i) {
ll n = N - i * B;
if (n >= 0) ans = min(ans, i * Z + n / A * Y + n % A * X);
}
}
printf("%lld\n", ans);
}
}
}
|