尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

UVa 612 DNA Sorting

UVa 612 DNA Sorting
📅 发布时间:2026/6/29 7:22:38

题目描述

序列中的“无序度”可以用逆序对的数量来衡量。例如,字母序列DAABEC中,D大于其右侧的四个字母,E大于其右侧的一个字母,因此逆序数为555。序列AACEDGG仅有一个逆序对(E和D),几乎有序;而ZWQM有666个逆序对,是完全逆序的。

你需要对一组DNA\texttt{DNA}DNA字符串(仅包含A、C、G、T四种字符)进行排序,但不是按字母顺序,而是按“有序程度”从“最有序”到“最无序”排列。所有字符串长度相同。若两个字符串逆序数相同,则保持它们在输入中的相对顺序。

输入格式

第一行为一个整数MMM,表示数据集的个数。接下来每个数据集的第一行包含两个整数:nnn(0<n≤500 < n \le 500<n≤50)表示字符串长度,mmm(0<m≤1000 < m \le 1000<m≤100)表示字符串个数。随后mmm行,每行一个长度为nnn的字符串(仅含A、C、G、T)。不同数据集之间可能存在空行,但cin可以忽略空白字符。

输出格式

对于每个数据集,输出mmm行,每行一个字符串,按逆序数从小到大排列。若逆序数相同,保持输入顺序。不同数据集的输出之间用一个空行分隔。

样例

输入

1 10 6 AACATGAAGG TTTTGGCCAA TTTGGCCAAA GATCAGATTT CCCGGGGGGA ATCGATGCAT

输出

CCCGGGGGGA AACATGAAGG GATCAGATTT ATCGATGCAT TTTTGGCCAA TTTGGCCAAA

题目分析

本题的核心是计算每个字符串的逆序数,并按逆序数升序排序。逆序数的定义:在一个序列中,如果一对字符i<ji < ji<j但si>sjs_i > s_jsi​>sj​(按字符ASCII\texttt{ASCII}ASCII码大小比较),则构成一个逆序对。由于字符串长度n≤50n \le 50n≤50,直接使用两层循环枚举所有字符对即可在O(n2)O(n^2)O(n2)时间内算出逆序数,总复杂度O(m⋅n2)O(m \cdot n^2)O(m⋅n2),完全可行。

排序时需要保持逆序数相同元素的原始顺序,因此应使用稳定排序算法(如stable_sort)。这与样例中逆序数相同的字符串保持原输入顺序的要求一致。

解题思路

  1. 读入MMM表示数据集个数。
  2. 对于每个数据集:
    • 读入nnn和mmm。
    • 循环mmm次,读入每个字符串。
    • 对每个字符串,通过两层循环统计逆序数:对于iii从000到n−1n-1n−1,jjj从i+1i+1i+1到n−1n-1n−1,若line[j] < line[i],则逆序数加111。
    • 将字符串和其逆序数存入结构体数组。
    • 使用stable_sort按逆序数升序排序。
    • 按排序后的顺序输出字符串。
    • 若非最后一个数据集,输出一个空行(即相邻数据集间空行)。

复杂度分析

  • 每个字符串计算逆序数:O(n2)O(n^2)O(n2),n≤50n \le 50n≤50,常数很小。
  • 排序:O(mlog⁡m)O(m \log m)O(mlogm),m≤100m \le 100m≤100。
  • 总时间复杂度:O(M⋅m⋅n2)O(M \cdot m \cdot n^2)O(M⋅m⋅n2),MMM未知但通常较小,完全可接受。
  • 空间复杂度:O(m)O(m)O(m),用于存储字符串和逆序数。

代码实现

// DNA Sorting// UVa ID: 612// Verdict: Accepted// Submission Date: 2016-08-23// UVa Run Time: 0.030s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;structitem{string dna;intinversion;booloperator<(constitem&another)const{returninversion<another.inversion;}};intgetInversion(string&line){intinversion=0;for(inti=0;i<line.length();i++)for(intj=i+1;j<line.length();j++)if(line[j]<line[i])inversion++;returninversion;}intmain(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);intcases=0,n,m;cin>>cases;vector<item>dnas;for(intc=1;c<=cases;c++){dnas.clear();if(c>1)cout<<'\n';cin>>n>>m;cin.ignore(1024,'\n');string line;for(inti=0;i<m;i++){getline(cin,line);dnas.push_back((item){line,getInversion(line)});}stable_sort(dnas.begin(),dnas.end());for(autodata:dnas)cout<<data.dna<<'\n';}return0;}

总结

本题是一个典型的排序应用题,核心在于正确计算逆序数并利用稳定排序保证相同逆序数的字符串保持原顺序。由于数据规模极小,直接暴力计算即可。该题也提醒我们,在排序时若需保持相等元素的原始顺序,应当使用稳定排序算法(如stable_sort),而不是普通sort。此解法简洁高效,适合作为入门级排序与模拟练习题。

相关新闻

  • 多模态AI的本质是张量代数:从线性映射到图文检索
  • Go语言Goroutine最佳实践:从并发基础到高性能实战
  • E-Hentai下载器:免费批量下载画廊图片的完整解决方案

最新新闻

  • Midscene:用自然语言驱动UI自动化测试,告别繁琐XPath定位
  • 复利不是理财概念,而是行为强化的数学本质
  • WarcraftHelper:让经典魔兽争霸3在现代系统上重获新生的终极解决方案
  • RA8D2安全与特权属性寄存器配置实战:构建硬件级嵌入式系统隔离
  • 终极指南:5分钟掌握大麦网自动化抢票神器,告别黄牛高价票
  • [智能体-572]:Link(智联)是腾讯微信官方开放的个人微信机器人通信协议,对外产品名称叫 ClawBot,是 2026 年腾讯推出、唯一合规的个人微信 Bot 通道。

日新闻

  • ENVI5.3.1实战:基于Landsat 8影像的区域无缝镶嵌与精准裁剪
  • 3步完成HS2-HF Patch安装:新手快速打造完美HoneySelect2体验
  • 微信好友检测终极指南:3分钟发现谁已悄悄删除你

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号