1 条题解

  • 0
    @ 2024-12-9 19:37:54

    不难发现取 1818 位有效数字一定能取到最优解,模拟即可。

    #include <bits/stdc++.h>
    using namespace std;
    string a[100012];
    int b[100012];
    int main()
    {
    	ios::sync_with_stdio(0);
    	int n;
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> a[i];
        for (int i = 1; i <= n; i++)
        	b[i] = a[i].size();
        long long p = 0;
        for (int i = 2; i <= n; i++)
        {
            int u = b[i];
            int v = b[i - 1];
            if (u > v || u == v && a[i] > a[i - 1]) continue;
            if (a[i] > a[i - 1].substr(0, min(18, u)))
            {
                int g = v - u;
                p += g;
                for (int j = 1; j <= g; j++)
                {
                    a[i] += '0';
                    b[i]++;
                    if (b[i] >= 18) break;
                }
                b[i] = u + g;
                continue;
            }
            if (a[i] < a[i - 1].substr(0, min(18, u)))
            {
                int g = v - u + 1;
                p += g;
                for (int j = 1; j <= g; j++)
                {
                    a[i] += '0';
                    b[i]++;
                    if (b[i] >= 18) break;
                }
                b[i] = u + g;
                continue;
            }
            if (a[i] == a[i - 1].substr(0, u))
            {
                bool ok = true;
                for (int j = u; j <= min(17, v - 1); j++)
                    if (a[i - 1][j] != '9') ok = false;
                if (v > 18) ok = false;
                int g = v - u;
                p += g;
                a[i] = a[i - 1];
                b[i] += g;
                if (!ok)
                {
                    a[i][min(17, v - 1)]++;
                    for (int j = min(17, v - 1); j >= 0; j--)
                    {
                        if (a[i][j] > '9')
                        {
                            a[i][j] = '0';
                            a[i][j - 1]++;
                        }
                    }
                }
                else
                {
                	b[i]++;
                    p++;
                    for (int j = u; j <= min(17, v - 1); j++)
                        a[i][j] = '0';
                    if (v < 18) a[i] += '0';
                }
                continue;
            }
        }
        cout << p << endl;
    	return 0;
    }
    
    • 1

    信息

    ID
    68
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    11
    已通过
    2
    上传者