天天看點

You Are Given a Decimal String...

​​B. You Are Given a Decimal String...​​

這個題需要求出從某一個尾數 n 變為 m 所需要的 x 和 y 的最小個數(i+j) 那麼就需要預處理出一個數組來存放這個值。數組 b[ ] 中存的是所需要多添加的數的個數 (i+j-1)
int b[10];
for (int i = 0; i < 10; ++i) b[i] = inf;
for (int i = 0; i < 10; ++i)
    for (int j = 0; j < 10; ++j)
    {
        if (i || j)
            b[(i * x + j * y) % 10] = min(b[(i * x + j * y) % 10], i+j-1);
                                                                 //i+j-1是需要多添加的數的個數
    }      

代碼:

// Created by CAD on 2019/8/9.
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f

using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s;
    cin >> s;
    for (int x = 0; x < 10; ++x)
        for (int y = 0; y < 10; ++y)
        {
            int b[10];
            for (int i = 0; i < 10; ++i) b[i] = inf;
            for (int i = 0; i < 10; ++i)
                for (int j = 0; j < 10; ++j)
                {
                    if (i || j)
                        b[(i * x + j * y) % 10] = min(b[(i * x + j * y) % 10], i + j - 1);
                }
            int ans = 0;
            for (int i = 0; s[i + 1] != '\0'; ++i)
                if (b[(s[i + 1] - s[i] + 10) % 10] == inf)
                {
                    ans = -1;
                    break;
                } else ans += b[(s[i + 1] - s[i] + 10) % 10];
            cout << ans;
            if (y == 9) cout << endl;
            else cout << " ";

        }
    return 0;
}