A70803 | 奖牌整理
来源编程题
时间限制1s
内存限制256MB
通过 / 提交0/0
题目描述
上完一天的课,小 Z 不但没有一丝疲惫感,反而觉得浑身是劲,好象又回到了童年, 他蹦蹦跳跳地回到家,吃过晚饭很快就做完了作业,抬头一看觉得房间太乱了,这不进入初三后由于课业繁重一直没时间整理房间,现在有空了是时候该好好整理一下了。
小 Z 首 先想要整理的是他那些心爱的奖牌,这些奖牌记录了小 Z 成长的足迹,其中有龙城少儿围 棋比赛的银牌,有华罗庚杯少年数学邀请赛的铜牌,份量最重的当数全国信息学奥林匹克 竞赛(National Olympiad in Informatics,简称 NOI)的金牌,小 Z 喜欢把他获得的奖牌 都挂在床头,并且成一字排开状,他每得到一枚奖牌就会在床头钉一颗钉子,将这枚奖牌 挂在所有奖牌的未尾,也就是说小 Z 的奖牌是按获得时间的先后顺序来排列的,现在小 Z 想把它们按金银铜的顺序排列,即所有的金牌挂在最前面,随后是银牌,最后是铜牌。
小 Z 重排奖牌的方法很特别,他每次都是同时伸出双手各摘下一块奖牌,然后把这两块奖牌 的位置对换一下,即左手摘下的奖牌放到右手摘下的奖牌的位置,右手摘下的奖牌放到左手摘下的奖牌的位置,咦!这怎么看上去有点象交换赋值,太有才了!
现在小 Z 想考考你, 给定奖牌序列,计算最少需要几次对换操作就可以将所有奖牌按金银铜牌的顺序排好。
输入格式
输入数据第一行只有一个正整数 N 表示奖牌序列的长度,其中 1 \le N \le 1000;
第二行有 N 个大写字母,每个大写字母代表一枚奖牌,其中 G 代表金牌,S 代表银牌,B 代表铜牌。
输出格式
输出数据仅有一行包含一个整数,表示最少需要几次对换操作。
输入输出样例
输入 #1
9 SSGBBBSBG
输出 #1
4
思路
用回溯生成排列:选一个未用数字 → 递归 → 撤销。
步骤
1. 读入 $n$ 或序列。
2. DFS/回溯枚举每个位置。
3. 按题面顺序输出所有排列。
C++ 编辑器
输入
输出
可保存默认模板;新题优先使用已保存模板。
当前快捷键仅展示,暂不支持修改。
- 撤销
Ctrl / ⌘ + Z - 重做
Ctrl / ⌘ + Y - 查找
Ctrl / ⌘ + F - 全选
Ctrl / ⌘ + A - 复制
Ctrl / ⌘ + C - 剪切
Ctrl / ⌘ + X - 粘贴
Ctrl / ⌘ + V - 自动排版
工具栏排版按钮 - 草稿保存
编辑时自动保存到本机
历史
提交记录
状态说明时间源码
AI
作答助手
你好,我是作答助手。可以问思路、复杂度、样例含义或代码报错原因;不会直接给出完整 AC 代码。
确定要清空代码吗?