ARC123 C - 1, 2, 3 - Decomposition(构造)
目录
Description
有一个数 \(n\),其中 \(n=\sum_{i=1}^{k}a[i]\),而 \(a[i]\) 的每位数由 \(1,2,3\) 组成,使得 \(k\) 最小
State
\(1<=t<=1000\)
\(1<=n<=10^{18}\)
Input
5
456
10000
123
314
91
Output
2
4
1
2
4
Solution
题目是经典的由较大的位数确定较小的位数的题目。
比如 \(714\), 最高位需要一个 \(3+3+1\) 保证 \(k\) 最小,那么接下来的每一位都必须 \(>=3\),因为每一个 \(a[i]\) 的每一个数位都 \(∈\{1,2,3\}\);
但是接下来的数位 \(1\),并不满足,那么就需要其向高位借位,变为 \(11\),而其高位也变成 \(6\),刚刚可以满足条件为止,\(k\) 就是最小值
Code
signed main()
{
//IOS;
rush(){
sll(n);
int bit[30] = {0}, tot = 0;
while(n) bit[++ tot] = n % 10, n /= 10;
int ans = 0;
while(true){
int maxx = 0, ok = 1;
while(bit[tot] == 0) tot --;
for(int i = tot; i && ok; i --){ //注意,如果不满足立即跳出,保证 k 最小
if(bit[i] < maxx){
bit[i] += 10;
bit[i + 1] --;
ok = 0;
}
maxx = max(maxx, (bit[i] + 2) / 3);
}
if(ok == 1){
ans = maxx;
break;
}
}
pd(ans);
}
//PAUSE;
return 0;
}