1 条题解
-
0
自动搬运
来自洛谷,原作者为

Alex_Wei
**搬运于
2025-08-24 22:22:52,当前版本为作者最后更新于2022-02-01 18:15:08,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
阴间模拟题。考虑求出使得 不同的第一个位置 ,有如下限制:
- 需要修改的位置数量不能超过 。
- 没有考虑到的位置数量不能小于还需要修改的位数。
具体地,对于每一位 ,求出 表示在第 位之前有多少 的位置。 合法的必要条件是 ,先判掉。由于上述限制要求修改位置数量既不能太小,也不能太大,所以需要考虑当前位是否修改:
- 若 ,说明可以不修改。此时若 且 则 合法。
- 若 或 ,说明可以 强制 修改(因为当 时不能修改)。此时若 且 则合法。
若找不到合法的 则无解。输出答案的过程时刻维护 表示还需要修改的位数:
- 若当前位 小于 ,输出 。
- 若当前位 等于 ,此时当 且 时输出 ,否则输出 ,前者因为这一位必须修改(否则将导致剩余位数小于要修改位数,不合法)。
- 若当前位 大于 ,此时当 且 时输出 ,否则输出 。
- 注意点:若输出的数码与 不同,则令 自减 。
- 注意点:任何时刻若 ,则输出 。
时间复杂度线性。
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; int n, k, p; char s[N], t[N]; void solve() { scanf("%s %s %d", s + 1, t + 1, &k), n = strlen(s + 1), p = 0; for(int i = 1, pr = 0; i <= n; i++) { if(t[i] - '0') { if(s[i] < t[i] && pr <= k && n - i >= k - pr) p = i; if((t[i] > '1' || s[i] > '0') && pr + 1 <= k && n - i >= k - pr - 1) p = i; } pr += s[i] != t[i]; } if(!p) return puts("-1"), void(); for(int i = 1, out; i <= n; i++) { if(i < p) out = t[i]; else if(!k) out = s[i]; else if(i == p) out = t[i] - 1 - (s[i] + 1 == t[i] && n - i + 1 == k); else out = '9' - (n - i + 1 == k && s[i] == '9'); putchar(out), k -= out != s[i]; } cout << endl; } int main() { int T; cin >> T; while(T--) solve(); return 0; }
- 1
信息
- ID
- 5718
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者