1 条题解
-
0
不难发现取 位有效数字一定能取到最优解,模拟即可。
#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
- 上传者