ACM详解(5)——排序

备战ACM资料 <br />备战ACM资料<br />一:知识点<br />    数据结构:<br />      1,单,双链表及循环链表<br />      2,树的表示与存储,二叉树(概念,遍历)二叉树的          <br />         应用(二叉排序树,判定树,博弈树,解答树等)<br />      3,文件操作(从文本文件中读入数据并输出到文本文       <br />         件中)<br />      4,图(基本概念,存储结构,图的运算)<br />   数学知识<br / 阅读详情
有些ACM题需要使用一些基本的数据结构,下面首先介绍与排序相关的内容。
1、基本排序
Problem Description
These days, I am thinking about a question, how can I get a problem as easy as A+B? It is fairly difficulty to do such a thing. Of course, I got it after many waking nights.
Give you some integers, your task is to sort these number ascending (升序).
You should know how easy the problem is now!
Good luck!
Input
Input contains multiple test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow. Each test case contains an integer N (1<=N<=1000 the number of integers to be sorted) and then N integers follow in the same line.
It is guarantied that all integers are in the range of 32-int.
Output
For each case, print the sorting result, and one line one case.
Sample Input
2
3 2 1 3
9 1 4 7 2 5 8 3 6 9
Sample Output
1 2 3
1 2 3 4 5 6 7 8 9
翻译:对给定的数字序列进行排序。使用数据结构的基本排序算法即可。可以使用各种排序算法实现。另外在Java中提供了排序方法,可以使用Arrays.sort方法,参考下面的代码:
Arrays.sort(a);
其中a是需要排序的数组。
下面给出了冒泡排序的代码供参考:
       /*
        * 冒泡排序
        */
       public static int[] sort(int[] a){
              // Arrays.sort(a);
              for(int i=0;i<a.length-1;i++){
                     for(int j=a.length-1;j>i;j--){
                            if(a[j]<a[j-1]){
                                   int temp = a[j];
                                   a[j] = a[j-1];
                                   a[j-1] = temp;
                            }
                     }
              }
              return a;
       }
2、DNA Sorting
Description
One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than four letters to its right and E is greater than one letter to its right. This measure is called the number of inversions in the sequence. The sequence ``AACEDGG'' has only one inversion (E and D)---it is nearly sorted---while the sequence ``ZWQM'' has 6 inversions (it is as unsorted as can be---exactly the reverse of sorted).
 
You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.
 
Input
 
The first line contains two integers: a positive integer n (0 < n <= 50) giving the length of the strings; and a positive integer m (0 < m <= 100) giving the number of strings. These are followed by m lines, each containing a string of length n.
Output
 
Output the list of input strings, arranged from ``most sorted'' to ``least sorted''. Since two strings can be equally sorted, then output them according to the orginal order.
Sample Input
10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT
 
Sample Output
CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA
 
翻译:对于一个序列的无序性可以使用相互之间无序的元素组的个数表示,例如字母序列DAABEC的无序性是5,D大于后面的AABC,E大于后面的C。而AACEDGG的无序性是1,因为只有E和D之间的顺序是乱的。
题目要求:对于给定的多个字符串(长度相同,由A, C, G和T组成),从最有序到最无序进行排列。
解题思路:计算每个字符串的无序性,然后进行排序即可。参考下面的代码:
       /*
        * DNA sorting
        */
       public static void test3(String[] dnas){
              Map invertions = new HashMap();
              // 计算每个字符串的乱序数量
              for(int i=0;i<dnas.length;i++){
                     invertions.put(dnas[i], count(dnas[i]));
              }
              // 排序
              for(int i=0;i<dnas.length-1;i++){
                     for(int j=dnas.length-1;j>i;j--){
                            if((Integer)(invertions.get(dnas[j]))<(Integer)(invertions.get(dnas[j-1]))){
                                   String temp = dnas[j];
                                   dnas[j] = dnas[j-1];
                                   dnas[j-1] = temp;
                            }
                     }
              }
              // 输出
              for(String temp:dnas){
                     System.out.println(temp+invertions.get(temp));
              }
             
       }
    // 计算无序性
       public static int count(String dna){
              int sum=0;
              for(int i=0;i<dna.length()-1;i++){
                     char temp = dna.charAt(i);
                     for(int j=i+1;j<dna.length();j++){
                            if(temp>dna.charAt(j))
                                   sum++;
                     }
              }
              return sum;
       }
上面计算无序性的代码是通过遍历字符串中的每个元素,然后判断后续的每个字符和它之间是否有序,需要遍历两次。如果字符串不是很长,这种算法还可以接受。如果字符串很长,计算将很耗时。下面的方法进行了改进。
    /*
     * 计算无序性(改进算法)
     */
    publicstaticint count2(String dna){
       int count[] = newint[4];
       Arrays.fill(count,0);
       int sum=0;
       for(int i=dna.length()-1;i>=0;i--){
           char temp = dna.charAt(i);
           switch(temp){
           case'A':
              count[0]++;
              break;
           case'C':
              count[1]++;
              sum = sum+count[0]; // 加上C后面的A的个数
              break;
           case'G':
              count[2]++;
              sum = sum+count[0]+count[1]; // 加上G后面的A和C的数量
              break;
           case'T':
              count[3]++;
              sum = sum+count[0]+count[1]+count[2]; // 加上G后面的A、C和G的数量
              break;
           }
       }
       return sum;
    }
另外在代码中,对序列进行排序是自己编写的排序算法。也可以使用系统提供的排序功能,需要编写一个类,参考代码如下:
class DNA implements Comparable{
       String content;
       int unsortness;
       DNA(String content,int unsortness){
              this.content = content;
              this.unsortness = unsortness;
       }
       @Override
       public int compareTo(Object o) {
              return unsortness-((DNA)o).unsortness;
       }    
}
修改后的代码如下:
    /*
     * DNA sorting
     */
    publicstaticvoid test3(String[] dnas){
       DNA newDnas[] = new DNA[dnas.length];
       for(int i=0;i<dnas.length;i++){
           newDnas[i] = new DNA(dnas[i],count(dnas[i]));
       }
       Arrays.sort(newDnas); // 替换了原来的排序算法
       // 输出
       for(DNA temp:newDnas){
           System.out.println(temp.content+temp.unsortness);
       }     
    }
最多排序到最少排序(分治法) 一.程序题(共1题,100.0分) 1、在线编程题4.求解按“最多排序”到“最少排序”的顺序排列问题 【问题描述】一个序列中的“未排序”的度量是相对于彼此顺序不一致的条目对的数量,例如,在字母序列“DAABEC”中该度量为5,因为D大于其右边的4个字母,E大于其右边的1个字母。该度量称为该序列的逆序数。序列“AACEDGG”只有一个逆序对(E和D),它几乎被排好序了,而序列“ZWQM”有6个逆序对,它是未排序的,恰好是反序。 需要对若干个DNA序列(仅包含4个字母A、C、G和T的字符串)分类,注意是分类而不 阅读详情

相关推荐

华为OD机试真题精讲:最长的顺子(Python/Java/C++多语言实现)

摘要:本文介绍了华为OD机试高频题目"最长的顺子"的解题思路与多语言实现。题目要求在扑克牌数组中,利用万能牌(0)组成最长连续顺子。核心解法包括:1)数据预处理(去重排序);2)滑动窗口算法计算可填补间隙的最长子序列;3)边界条件处理。提供了Python、Java、C++三种实现,均通过时间复杂度O(n log n)和空间复杂度O(n)的优化,满足题目对10^5数据量的性能要求。

bkspiderx的博客 211

C++-PTA 求解按“最多排序”到“最小排序”的顺序排列问题。

PTA 求解按“最多排序”到“最小排序”的顺序排列问题。

害怕也得前进 4302

ACM编程竞赛代码实践详解

国际大学生程序设计竞赛(ACM-ICPC)是一项由国际计算机学会(ACM)主办的全球性算法竞赛。这一章将简要介绍ACM-ICPC的起源、竞赛模式和它在编程界的重要性。字符串处理技巧在编程竞赛中占有重要地位。理解和掌握基础的字符串匹配算法,如朴素匹配和KMP算法,以及字符串处理的高级技巧,如字符串哈希,对于解决复杂问题至关重要。在实际应用中,通过将这些算法与其他算法结合,可以优化问题的解决过程,提升代码的运行效率。在后续的章节中,我们将继续探讨ACM竞赛中其他重要的算法和数据结构的应用。

weixin_42311427的博客 1076

ACM入门基础-排序

写在前面 在入门算法中最为重要的我认为就是排序算法了,将数据排序后将会有许多良好的性质,有序、递增的数据很多时候就是解题的关键,排序算法有很多,常见的有冒泡排序、选择排序、快速排序、归并排序、桶排序…排序算法五花八门,但归根到底的作用就是将无序的数据进行升序或者降序排序,本文通过几道例题来分析各个排序算法的使用场景以及优劣性,但是本文不具体讲述排序算法的实现过程,侧重于对数据的分析从而选择合适的算法。 各大排序时间算法复杂度 数据量:n 数据范围 :m 冒泡、选择排序 时间复杂度O(n2)O(n^{2})

TGX的博客 856

ACM竞赛新手编程训练:杭电11页基础题详解

ACM国际大学生程序设计竞赛(ACM International Collegiate Programming Contest,简称ACM ICPC)是一项由国际计算机学会(ACM)主办的年度性竞赛,旨在激发大学生对算法和程序设计的兴趣,同时也提供了一个展示自己编程能力和团队合作精神的平台。竞赛的历史可以追溯到1970年,当时由美国IBM公司赞助,竞赛的形式和宗旨几乎没有变化,强调的一直是解决复杂问题的能力和编写高效、优雅代码的能力。

weixin_36047538的博客 868

电池保护板为什么采用NTC热敏电阻而不是PTC热敏电阻?

R25=10K,即环境温度25°时,阻值是10K),温度变化1°C,阻值相应地明显变化,温度响应很灵敏,也就能精准地反向换算出阻值对应的温度。另外,还有功率型NTC热敏电阻,其主要用在开关电源设计中,串联在市电输入上,抑制浪涌电流。电池保护板上的NTC热敏电阻(NTC一端接地,另一端接电池充电控制IC管脚),在电池温度上升时,NTC热敏电阻温度也会随之上升,从而NTC电阻值会下降,因此电池充电控制IC用ADC检测的电压值就降低,当检测到的电压值达到下限阈值时,电池充电控制IC就会停止对电池的充电或放电。

电子绿洲的博客 5630

[ACM] 常用排序算法对比

文章目录字典序十大排序不稳定排序快速排序 - 每次排序让标志位一边都比它大,另一边都比它小缺点:数据已经有序时,时间复杂度退化为 O(n2)O(n^2)O(n2)堆排序 -优点:时间复杂度恒定为 O(nlog⁡n)O(n \log{n})O(nlogn)选择排序 - 每次遍历选出最小的和 first++ 交换希尔排序 - 分为多个子序列进行插入排序稳定排序冒泡排序 - 每次选两个向后依次比较直接插入排序(打牌) - 每次选一个依次和前面比优点:数据几乎有序时时间复杂度达到 O(n)O(n)O(n)归并排序非

qq_43435084的博客 1642

ARM CMSIS DAP源码分析(二)

今天分析的是RDDI_DAP_GetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)和RDDI_DAP_SetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)这两个函数。 以RDDI_DAP_GetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)为例,代码如下:

pengxiao618的专栏 7977

ACM排序

ACM比赛中排序方法 1.C的qsort #include 代码: int cmp(const void *p,const void *q) { return *((int *)p)-*((int *)q); } qsort(array,n,sizeof(array[0]),cmp) 六类qsort排序方法: qsort函数很好用,但有时不太会用比如按结构体一级

xuruoxin的专栏 1201

cosmos-curate工业级视频数据预处理引擎/终端用户指南( end-user-guide)

摘要:Cosmos-Curate是一个用于视频和自动驾驶数据处理的开源工具,提供从本地到集群的完整部署方案。文档针对三类用户:终端用户(配置运行现有管道)、开发者(修改/创建管道)和贡献者(改进代码库)。核心功能包括容器化设计(Docker+NVIDIA工具链)、多平台支持(本地/Slurm/云)、集成HuggingFace/NGC模型,以及可扩展的管道架构。使用需满足硬件(如Ampere架构GPU)和软件(Ubuntu22.04+Python3.10)要求,通过CLI工具构建镜像、下载模型并运行示例管道(

qq_45053161的博客 1204

基于稀疏表示字典学习的图像超分辨率-杨建超论文解析

文章:《Image Super-Resolution via Sparse Representation》 作者:杨建超 信号稀疏的定义: 令字典D的原子个数M,信号维度为N,则有以下三种关系: M = N时,D为完备的; M > N时,D为冗余的; M>>N时, D为过完备的。 图解如下: 借鉴了压缩感知的思想,通过对大量低分辨率图像和高分辨...

ycc18829026593的博客 7638

ACM[排序题]

题目描述(如有错误,欢迎提出,谢谢,我将继续努力) 今年的ACM世界总决赛快要开始了,需要有一个排名算法来对每支队伍进行现场排名。ACM组委会把这个任务交给了你,相信你一定能很好地完成。 排名规则如下:通过题的数目多的队伍排名靠前,如果有多支队伍过的题的数目相同,则罚时少的队伍排名靠前。 输入 输入的第一行包括一个整数N(1,代表参加比赛的队伍的个数。 接下来的N行每行包括一

bubbleTg的博客 2438

Arthas实战(3)- CPU使用率高问题排查

Arthas实战(3)- CPU使用率高问题排查

java_liuyuan的博客 1732

拿到acm铜奖可以去大厂吗?

从ACM选手的角度讲: 为什么ACM选手在大家眼里都这么牛逼,原因就是很多ACM选手从中学就开始打比赛,你想想看,在你大学才懂一些简单的数据结构和算法的时候,这些中学生就已经ACM竞赛中畅游了。当然,也不是所有人都这样,比如我就不属于这一批,本人大一才开始准备。 除此之外,ACM的题目都很难,难到什么程度?本人在准备期间刷题刷到一度恶心。ACM竞赛很注重选手的分析和思维两方面的能力,在算法和数据结构这样已经足够复杂的题型下,还要进行大量的变形,所以没有一个高强度的培训是不可能有能力参赛。 所以,经历过AC

九章算法的博客 9425

QGIS v3.28 高效加载OSM在线地图的三种实用方法

本文详细介绍了在QGIS v3.28中高效加载OSM在线地图的三种实用方法:通过XYZ Tiles直接连接、使用QuickMapServices插件以及配置WMS/WTMS服务。针对每种方法提供了具体操作步骤、常见问题解决方案和性能优化建议,帮助用户根据需求选择最适合的方案,提升GIS工作效率。

weixin_29233333的博客 435

Xilinx XDMA驱动代码分析及用法

Xilinx XDMA驱动代码分析及用法 先简单的介绍一下,赛灵思的XDMA的驱动是用于做什么的、他的主要功能就类似与网卡pcie接口的网卡驱动、用于控制主机与fpga设备进行pcie的通讯。通讯的主要方式是设备文件的读写,这里不清楚的同学可以看一下我上一篇文章。通过控制设备文件的读写,操作驱动与fpga设备进行数据传输。 1、目录结构 zacha@Superman:~/nfs/xdma-debug/dma_ip_drivers-master/XDMA/linux-kernel$ tree -C . ├──

恍恍惚惚的大穷猫的博客 3万+

【ACM】C++程序设计ACM题库总结

浙江工业大学ACM部分题解析+代码

chenmeng的博客 4407

【OpenCV】图像的像素直方图 图像特征点 cv::FAST cv::ORB ORB_SLAM2::ORB

文章目录图像直方图代码实现cv::FAST和cv::ORB 检测图像特征点cv::FAST和cv::ORB 检测图像特征点代码实现ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比ORB_SLAM2::ORB和自己实现ORB图像特征点检测效果对比代码实现 图像直方图代码实现 图像是由不同数值(颜色)的像素构成的,像素值在图像中的分布情况是图像的重要属性,可以用直方图修改图像的外观,标识图像的内容,检测图像中特定的物体或纹理。 单通道灰度图像中每个像素都有一个 0(黑色)-255(白色)的整

小秋 AI SLAM 入门实战教程 2510

ACM部分学习路线

前言:接触ACM也有接近一年的时间了,上一学年学习的知识点也是零零散散,最近打算好好根据论坛上找到的学习路线重新拉一遍,顺便写写博客记录题解和算法笔记,这也算是来优快云发布的第一篇文章了。这篇文章只是一篇总结和链接,各个知识点的链接会根据我的复习(学习)进度陆续更新,希望能完结。 参考文章: ACM算法学习路线、清单 ACM路线 算法竞赛入门到进阶 --- 完整学习路线(含知识点讲解) ACM学习计划 一.基础篇 众所周知,ACM竞赛是三人小队,三个人每个人都会选择不同的方向...

issey的博客 2935

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

acm新手小白必看系列之(2)——基本排序及cmp函数精讲及例题

acm新手小白必看系列之(2)——排序及cmp函数 sort排序 sort是c++自带函数 复杂度 n*log(n) 包含在头文件 #include的c++标准库里 函数有三个参数 1.要排序的数组的起始地址 2.数组的结束地址 3.第三个参数是排序的方法,可以不写,默认是从小到大 sort(a,a+n) -----默认从小到大排序 比如 int a[ ]={2,7,1,5,0} 我们可以写...

永恒之蓝的博客 2701

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ACM - 归并排序

程序 /** *@descript : 归并排序 *@author : chenzx *@copyright: 2012-12-3(c++) */ #include using namespace std; const int N = 7; void print_arry(int * arry, int len){ for (int i =

chenzhuoxue的专栏 613

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ACM练习 小Z来讲排名规则(WA)【C++ stable_sort稳定排序】

描述 本次比赛严格按照ACM的排名规则进行,但可能很多小伙伴并不太了解这个排名方法,今天小Z来给大家简单说明一下。每个人的排名根据他解出的题目数量、做题时间还有错误提交次数决定,呃。。。在某些特殊情况下跟大家的昵称也有关系哟~不过不要着急去改昵称,毕竟是特殊情况,很难遇到的。下面我具体说明一下。 排名的第一关键字是解出的题目数,也就是说,解出题目数量多的小伙伴一定会排在解出题目数量少的小伙伴前...

寒泉 1万+
上一篇: ACM详解(6)——栈
下一篇: ACM详解(6)——栈
老李-大连
博客等级 码龄20年 3206粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值