尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
题解:洛谷 P1459 [USACO2.1] 三值的排序 Sorting a Three-Valued Sequence
本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。欢迎大家订阅我的专栏算法题解C与Python实现附上汇总贴算法竞赛备考冲刺必刷题C | 汇总【题目来源】洛谷P1459 [USACO2.1] 三值的排序 Sorting a Three-Valued Sequence - 洛谷【题目描述】排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种 1,2,3。我们用交换的方法把他排成升序的。写一个程序计算出给定的一个 1,2,3 组成的数字序列排成升序所需的最少交换次数【输入】第一行一个正整数n表示奖牌个数。接下来n行每行一个 [1,3] 内的整数表示奖牌。【输出】输出一行一个整数表示排成升序所需的最少交换次数。【输入样例】9 2 2 1 3 3 3 2 3 1【输出样例】4【核心思想】问题分析给定一个由1 , 2 , 3 1, 2, 31,2,3组成的序列要求通过交换操作将其排成升序所有1 11在前2 22在中3 33在后求最少交换次数。排序后1 11的区间为[ 1 , n u m [ 1 ] ] [1, num[1]][1,num[1]]2 22的区间为[ n u m [ 1 ] 1 , n u m [ 1 ] n u m [ 2 ] ] [num[1]1, num[1]num[2]][num[1]1,num[1]num[2]]3 33的区间为[ n u m [ 1 ] n u m [ 2 ] 1 , n ] [num[1]num[2]1, n][num[1]num[2]1,n]。算法选择贪心交换策略优先处理直接互换一次交换解决两个错位再处理三角互换两次交换解决三个错位错位分类将错位的元素按所在区间和目标区间分类统计六种错位类型关键步骤统计数量遍历序列统计n u m [ 1 ] , n u m [ 2 ] , n u m [ 3 ] num[1], num[2], num[3]num[1],num[2],num[3]各数字出现次数确定排序后三个区间的边界第一轮直接互换一次交换修复两个位置[ 1 , 2 ] [1,2][1,2]互换在1 11的区间内找2 22在2 22的区间内找1 11配对交换[ 1 , 3 ] [1,3][1,3]互换在1 11的区间内找3 33在3 33的区间内找1 11配对交换[ 2 , 3 ] [2,3][2,3]互换在2 22的区间内找3 33在3 33的区间内找2 22配对交换第二轮三角互换一次交换修复一个位置剩余错位形成三角循环在1 11的区间内找非1 11的元素与后面区间中的1 11交换在2 22的区间内找非2 22的元素与后面区间中的2 22交换输出结果总交换次数a n s ansans时间/空间复杂度时间复杂度O ( n 2 ) O(n^2)O(n2)最坏情况下需要双重循环查找配对元素空间复杂度O ( n ) O(n)O(n)存储序列数组贪心交换的核心思想直接互换优先a [ i ] 2 , a [ j ] 1 a[i]2, a[j]1a[i]2,a[j]1且i ii在1 11区间、j jj在2 22区间时一次交换同时修复两个位置成本最低三角循环处理直接互换后剩余的错位元素形成三角循环如1 11区间有2 222 22区间有3 333 33区间有1 11需要两次交换修复三个位置区间边界固定排序后各数字的位置区间由数量唯一确定无需实际排序即可知道每个元素的目标位置贪心最优性优先执行直接互换不会破坏后续更优解且每次直接互换减少两个错位是局部最优选择适用于有限取值排序、最小交换次数、错位修复类问题【解题思路】【算法标签】#普及- #贪心【代码详解】#includebits/stdc.husingnamespacestd;intn,num[5],a[1005],ans0;intmain(){cinn;// 输入nfor(inti1;in;i){// 依次输入n个值cina[i];num[a[i]];// 同时记录每个数的数量}for(inti1;inum[1];i){// 在排序后1的范围和2的范围内for(intjnum[1]1;jnum[1]num[2];j){if(a[i]2a[j]1){// 查找[2,1]和[1,2]的情况swap(a[i],a[j]);// 进行对调ans;break;}}}for(inti1;inum[1];i){// 在排序后1的范围和3的范围内for(intjnum[1]num[2]1;jn;j){if(a[i]3a[j]1){// 查找[3,1]和[1,3]的情况swap(a[i],a[j]);// 进行对调ans;break;}}}for(intinum[1];inum[1]num[2];i){// 在排序后2的范围和3的范围内for(intjnum[1]num[2]1;jn;j){if(a[i]3a[j]2){// 查找[3,2]和[2,3]的情况swap(a[i],a[j]);// 进行对调ans;break;}}}for(inti1;inum[1];i){// 在排序后1的范围和2、3范围内for(intjnum[1]1;jn;j){if(a[i]!1a[j]1){// 查找不等于1和等于1的swap(a[i],a[j]);// 进行对调ans;break;}}}for(intinum[1]1;inum[1]num[2];i){// 在排序后2的范围和3的范围内for(intjnum[1]num[2]1;jn;j){if(a[i]!2a[j]2){// 查找不等于2和等于2的swap(a[i],a[j]);// 进行对调ans;break;}}}coutansendl;// 输出调换次数return0;}【运行结果】9 2 2 1 3 3 3 2 3 1 4
RELATED

相关推荐

VLC Android播放器使用指南:7个真实场景带你从新手用到顺手

VLC Android播放器使用指南:7个真实场景带你从新手用到顺手

VLC Android播放器使用指南:7个真实场景带你从新手用到顺手 【免费下载链接】vlc-android VLC for Android, Android TV and ChromeOS 项目地址: https://gitcode.com/gh_mirrors/vl/vlc-android 说起手机上的播放器,很多人装了一堆"格式解…

📅 2026/9/17 1:47:30
从创客视角解析传感器投送系统:机械设计与Arduino控制实战

从创客视角解析传感器投送系统:机械设计与Arduino控制实战

1. 从“发射器”到“声呐药丸”:一个硬件创客的跨界探索 最近在整理工作室的旧项目时,翻出了一个被我戏称为“Sonar Pill Launcher”的玩意儿。这名字听起来有点科幻,像是某种微型水下探测器的发射装置。实际上,它源于几年前我一次…

📅 2026/10/6 1:05:08
大模型API防蒸馏机制解析与合规高效应用架构实践

大模型API防蒸馏机制解析与合规高效应用架构实践

在实际 AI 模型部署和 API 服务集成中,我们常常会遇到一个看似矛盾的需求:一方面希望利用云端大模型的强大能力,另一方面又受限于成本、延迟、数据隐私或网络稳定性。一个常见的折中方案是“知识蒸馏”,即尝试用大模型的输出来训练…

📅 2026/10/11 13:38:43
MORE NEWS

更多资讯

📰

PS5折腾指南:系统配置、存储扩展、远程游玩与散热维护

PS5到手三个月后,我发现自己陷入了一个尴尬循环:开机看一眼、随便通关一个进度、然后切出去看手机,主机外壳摸起来都能煎鸡蛋。直到我给自己定了个"AnyPS5"计划——不把这台机器当普通游戏机,而是当成一台可折腾的娱乐终…

📰

边缘实时分析系统架构设计与实践:边缘计算下的轻量级数据处理与智能化决策

1. 项目背景与整体设计思路拆解1.1 项目代号“rea”从哪来,到底解决了什么问题先说结论:这个代号在我这边是Real-time Edge Analytics的缩写,中文可以叫“实时边缘分析”。最初立项的时候,它其实是某物联网数据平台项目里的一个子…

📰

Python+Vue前后端分离学生选课管理系统开发实战

这几年高校教务系统一直是很多开发者练手的热门方向,尤其是学生选课管理系统,业务场景清晰、技术栈覆盖广、坑点也很典型。我之前完整做了一套基于 Python 和 Vue 的前后端分离版本,用 PyCharm 作为主力开发工具,框架层面对比过 D…

📰

Vivo手机数据备份与恢复全指南:换机迁移防丢数据实操

手机里最贵的东西,从来不是手机本身,而是里面那些联系人、聊天记录和照片。这句话我在帮朋友迁移数据时说过很多次。很多人以为Vivo系统自带的备份功能随便点一下就行,结果换机之后才发现微信聊天记录没了、照片原图缺了不少,想找…

📰

数据复制深度拆解:从HDFS块复制到CDC同步的机制、实践与容灾设计

大数据领域做久了,你会发现一个很朴素但又绕不开的现实: 数据复制 几乎贯穿了所有核心系统的生命周期。无论是离线数仓里的表同步、实时链路里的CDC采集,还是跨机房容灾里的镜像复制,本质上都在做同一件事——把一份数据从A点搬…

📰

AI芯片软硬件协同设计实战:从GPU瓶颈到专用架构的权衡

1. 为什么GPU不能通吃所有AI场景:从算力垄断到专用芯片做了几年AI芯片的软硬件协同设计,我经常被问到同一个问题:现在GPU这么强,H100、A100都上万卡了,为什么还要费劲搞专用AI芯片?等GPU大规模铺开之后&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬