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;
}
posted @ 2021-08-25 15:31  Bcoi  阅读(85)  评论(0)    收藏  举报