- P65's solution
P65's Solution
- 2025-9-4 21:59:44 @
不难发现取 位有效数字一定能取到最优解,模拟即可。
#include <bits/stdc++.h>
using namespace std;
string a[1000012];
int b[1000012];
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;
}