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

Vix
AFO搬运于
2025-08-24 22:35:25,当前版本为作者最后更新于2022-09-24 15:47:48,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题意
给定只包含 三种字母的两个长度相等的字符串 , 只改变 串字母位置后得到的新串 ,使得 , 都满足 ,求字典序最小的 。
范围:。
分析
首先有且仅有 三个字母,又要满足字典序最小,容易想到贪心,因为对于 串中的每一个字母,我们最多只有两个字母可以选择。比如当 时,那么 或 。现在问题就转化成了在两个字母中选择哪一个,贪心地想,显然选择字典序更小的字母更优,但是原题限制了 是由 变幻而来的,所以 串中 的数量是一定的,可能当前选了某个字母后,剩下的字母无法让 和 每一位都不等。所以正确的策略应该是在保证 和 每一位都不等的情况下,选择更优的字母。
怎样保证不等呢?记 中剩余的 的数量为 , 中剩余的 的数量为 ,恒有 , , 。假如要选择 ,就要满足 并且 , 以此类推,因为只有三个字母,可以直接判断,时间复杂度 。
Code
#include <bits/stdc++.h> using namespace std; const int N = 5e3 + 10; int n; char s[N]; int cnt[3], aim[3]; //用 0, 1, 2 代表 a, b, c int main() { scanf("%d%s", &n, s + 1); for (int i = 1; i <= n; i++) if (s[i] == 'a') cnt[0]++; else if (s[i] == 'b') cnt[1]++; else cnt[2]++; scanf("%s", s + 1); for (int i = 1; i <= n; i++) if (s[i] == 'a') aim[0]++; else if (s[i] == 'b') aim[1]++; else aim[2]++; for (int i = 1; i <= n; i++) if (s[i] == 'a') { aim[0]--; if (cnt[1] && cnt[1] - 1 + cnt[2] >= aim[0] && cnt[1] - 1 + cnt[0] >= aim[2]) cnt[1]--, printf("b"); else cnt[2]--, printf("c"); } else if (s[i] == 'b') { aim[1]--; if (cnt[0] && cnt[0] - 1 + cnt[1] >= aim[2] && cnt[0] - 1 + cnt[2] >= aim[1]) cnt[0]--, printf("a"); else cnt[2]--, printf("c"); } else { aim[2]--; if (cnt[0] && cnt[0] - 1 + cnt[1] >= aim[2] && cnt[0] - 1 + cnt[2] >= aim[1]) cnt[0]--, printf("a"); else cnt[1]--, printf("b"); } return 0; }后话
建议评橙,考场上很快就想到正解了,不是很难的贪心,听机房的人说可以用爆搜过,tql
这是本蒟蒻的第一篇题解,有什么错还请dalao指出。
- 1
信息
- ID
- 7382
- 时间
- 1000ms
- 内存
- 64MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者