POJ1007:DNA排序

news2025/3/1 21:19:33

一、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

六、Source

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DNA_LEN 50
#define DNA_NUM 100

#define BUFFER_SIZE 10000

typedef struct
{
    int unsortedness;
    char dnaString[DNA_LEN];
}Dna;

typedef struct
{
    int dnaLen;
    int dnaNum;
    Dna dna[DNA_NUM];
    Dna* pDna[DNA_NUM];
}DnaSequence;

DnaSequence DnaSeq;

void GetDnaSequence(DnaSequence *dnaSeq)
{
    int i;

    scanf("%d %d\n", &dnaSeq->dnaLen, &dnaSeq->dnaNum);

    for(i = 0; i < dnaSeq->dnaNum; i++)
    {
        if(NULL == gets(dnaSeq->dna[i].dnaString)) break;

        dnaSeq->pDna[i] = &dnaSeq->dna[i];
    }
}

void PrintDnaSequence(DnaSequence *dnaSeq)
{
    int i;

    for(i = 0; i < dnaSeq->dnaNum; i++)
    {
        printf("%s\n", dnaSeq->pDna[i]->dnaString);
    }
}
/*
void CalcUnsortedness(Dna* dna, int dnaLen)
{
    int delta,i,j;
    dna->unsortedness = 0;
    for(i = 0; i < dnaLen; i++)
    {
        for(j = i+1; j < dnaLen; j++)
        {
            delta = dna->dnaString[i] - dna->dnaString[j];
            if(delta > 0) dna->unsortedness++;
        }
    }
}
*/
void CalcUnsortedness(Dna* dna, int dnaLen)
{
    int i;
    int A = 0, C = 0, G = 0;
    dna->unsortedness = 0;
    for(i = dnaLen - 1; i >= 0; i--)
    {
        switch(dna->dnaString[i])
        {
            case 'A':
                A++;
                break;
            case 'C':
                C++;
                dna->unsortedness += A;
                break;
            case 'G':
                G++;
                dna->unsortedness += A+C;
                break;
            case 'T':
                dna->unsortedness += A+C+G;
                break;
            default:
                break;
        }
    }
}

int SortCmp(const void* elem1, const void* elem2)
{
    Dna* dna1 = (Dna *)(*(size_t*)elem1);
    Dna* dna2 = (Dna *)(*(size_t*)elem2);

    return dna1->unsortedness - dna2->unsortedness;
}

char g_mergeBuffer[BUFFER_SIZE];

void Merge(char* array, int elemSize, int left, int mid, int right, int (*SortCmp)(const void*, const void*))
{
    int i = left;
    int j = mid;
    int bufIdx = 0;

    while(i < mid && j <= right)
    {
        if(SortCmp(&array[i*elemSize], &array[j*elemSize]) <= 0)
        {
            memcpy(&g_mergeBuffer[bufIdx], &array[i*elemSize], elemSize);
            i++;
        }
        else
        {
            memcpy(&g_mergeBuffer[bufIdx], &array[j*elemSize], elemSize);
            j++;
        }
        bufIdx += elemSize;
    }

    for(; i < mid; i++)
    {
        memcpy(&g_mergeBuffer[bufIdx], &array[i*elemSize], elemSize);
        bufIdx += elemSize;
    }

    for(; j <= right; j++)
    {
        memcpy(&g_mergeBuffer[bufIdx], &array[j*elemSize], elemSize);
        bufIdx += elemSize;
    }

    memcpy(&array[left*elemSize], g_mergeBuffer, (right-left+1)*elemSize);
}

void MergeSort(void* array, int arrayLen, int elemSize, int (*SortCmp)(const void*, const void*))
{
    int loop, left, mid, right = 0;

    for(loop = 1; loop < arrayLen; loop *= 2)
    {
        left = 0;
        right = 0;
        while(right < arrayLen - 1)
        {
            mid = left + loop;
            right = (mid + loop - 1 > arrayLen - 1) ? (arrayLen - 1) : (mid + loop - 1);
            Merge((char*)array, elemSize, left, mid, right, SortCmp);
            left = left + loop * 2;
        }
    }
}

void ProcDnaSequence(DnaSequence *dnaSeq)
{
    int i;
    int elemSize = sizeof(dnaSeq->pDna[0]);

    for(i = 0; i < dnaSeq->dnaNum; i++)
    {
        CalcUnsortedness(&dnaSeq->dna[i], dnaSeq->dnaLen);
    }
    MergeSort(dnaSeq->pDna, dnaSeq->dnaNum, elemSize, SortCmp);
}

int main()
{
    GetDnaSequence(&DnaSeq);
    ProcDnaSequence(&DnaSeq);
    PrintDnaSequence(&DnaSeq);
    return 0;
}

七、总结

逆序数可以用来描述一个序列混乱程度的量。例如,“DAABEC”的逆序数为5,其中D大于他右边的4个数,E大于他右边的1个数,4+1=5;又如,“ZWQM”的逆序数为3+2+1+0=6。现在有许多长度一样的字符串,每个字符串里面只会出现四种字母(A,T,G,C)。要求编写程序,将这些字符串按照他们的逆序数进行排序。
要求用稳定的排序算法,所以选择了归并排序。计算逆序数原本没想太多用的暴力遍历,但是后来看评论,发现一种有趣的算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

傻白入门芯片设计,典型的2D/2D+/2.5D/3D封装技术(六)

集成电路终于成为了一级学科&#xff0c;对集成电路领域的投入也日益加大&#xff0c;集成电路属于电子集成技术的一种&#xff0c;那么&#xff0c;现在的电子集成技术发展到了什么程度呢&#xff1f; 先进的电子集成技术可以在不到芝麻粒大小的1平方毫米内集成1亿只以上的晶体…

Tableau 合集3:格式设置之可视化图显示百分比和提示工具对齐问题

一、前言 本文通过可视化图中显示不了百分比和提示工具无法对齐两个小问题出发&#xff0c;介绍了关于Tableau设置格式和工具提示的一些使用方法。 环境&#xff1a;Windows11 64位、Tableau desktop 2021.2 二、问题1&#xff1a;可视化图中显示不了百分比 问题描述&#…

springboot整合其它项目(连接池和监控)

目录 一、整合Druid 1. Druid是什么&#xff1f; 2.如何在Spring Boot中集成Druid连接池和监控&#xff1f; 二、整合Redis 1.集成redis之非注解式开发 2.集成redis之注解缓存开发 一、整合Druid 1. Druid是什么&#xff1f; Druid是Java语言中最好的数据库连接池。…

paddleocr识别模型训练记录

准备数据集 自己新建目录 下载识别预训练模型 下载之后是一个压缩包&#xff0c;解压后&#xff08;注意&#xff1a;rec是自己新建的目录&#xff09; 修改配置文件 修改内容&#xff1a; 1.训练后模型存储目录&#xff1b; 2.是否训练可视化&#xff1b; 3.训练数据集图…

tensorflow2 minist手写数字识别数据训练

✨ 博客主页&#xff1a;小小马车夫的主页 ✨ 所属专栏&#xff1a;Tensorflow 文章目录前言一、tenosrflow minist手写数字识别代码二、输出三、参考资料总结前言 刚开始学习tensorflow&#xff0c; 首先接触的是minist手写数字识别&#xff0c;用的梯度下降算法&#xff0c;…

linux下mysql的三种安装方法

目录1. 离线安装&#xff08;.tar.gz安装包&#xff09;2. 离线安装&#xff08;rpm安装包&#xff09;3. 在线安装&#xff08;yum安装&#xff09;前言安装环境 : Redhat Enterprise Linux 81. 离线安装&#xff08;.tar.gz安装包&#xff09; 参考这篇博客 2. 离线安装&am…

HTB-Toolbox

HTB-Toolbox信息收集提权信息收集 使用nmap简单扫描一下网站端口。 21 ftp22 ssh443 https&#xff1f; 去https看看。 网站基本是静态的。因为是https&#xff0c;所以有ssl协议&#xff0c;去看看吧。 more information里面能找到协议。 找到admin.megalogistic.com子域。…

Spring(完整版)

文章目录一、Spring(一)、Spring简介1、Spring概述2、Spring家族3、Spring Framework1、Spring Framework五大功能模块2、Spring Framework特性(二)、控制反转IOC1、IOC容器1、IOC思想2、IOC容器在Spring中的两种实现方式①BeanFactory②ApplicationContext③ApplicationContex…

配置elasticsearch用windows account(AD)登录

配置elasticsearch用windows account&#xff08;AD&#xff09;登录编辑es的配置文件创建role mapping文件添加windows account的密码给role mapping和cacert文件正确的权限重启kibana和elasticsearch在kibana页面登陆elasticsearch参考文章&#xff1a;• https://www.elasti…

vue中如何使用swiper以及解决swiper初始化过早的问题

后端的返回的数据用数组接收; 把swiper放到根组件里的mounted&#xff0c;也会出现swiper先初始化&#xff0c;dom再加载的问题&#xff1a; swiper初始化在mounted里执行&#xff1b;setTimeout定时器是从后端请求回来的数据&#xff1b; 代码执行顺序是&#xff1a;当组件创…

Eureka Server配置

01.Eureka Server配置 Eureka Server提供注册服务&#xff0c;各个节点启动后&#xff0c;会在EurekaServer中进行注册&#xff0c;Eureka Server会存储所有可用信息的服务节点&#xff0c;其信息可以在界面中直观的观察到。&#xff08;服务注册中心 CAP核心理论 一个分布式…

(十六)Spring对事务的支持

文章目录环境事务概述引入事务场景第一步&#xff1a;准备环境第二步&#xff1a;编写持久层第三步&#xff1a;编写业务层第四步&#xff1a;编写Spring配置文件第五步&#xff1a;编写表示层&#xff08;测试程序&#xff09;模拟异常Spring对事务的支持Spring事务管理API声明…

mysql-6-主从复制搭建

1 总结 1&#xff1a;主从复制最大缺陷就是延迟。 2 搭建前的准备 2.1复制的基本原则 每个slave只有一个master每个slave只能有一个唯一的服务器ID每个master可以有多个slavemysql版本尽量一致&#xff0c;防止出问题。两台服务能ping通MySQL主从是基于binlog的&#xff0c;主上…

Face Global | 创龙科技2款新品登陆TI全球官网

日前,创龙科技AM62x、AM64x处理器平台齐登TI全球官方网站,向全球TI用户提供高可靠性的工业核心板以及工业评估套件。 图 1 TI全球官网截图-AM64x 图 2 TI全球官网截图-AM62x 创龙科技(Tronlong)作为TI中国官方合作伙伴,自2013年成立以来,已基于TI Sitara、C6000、DaVinci、…

【网络安全必看】如何提升自身WEB渗透能力?

前言 web渗透这个东西学起来如果没有头绪和路线的话&#xff0c;是非常烧脑的。 理清web渗透学习思路&#xff0c;把自己的学习方案和需要学习的点全部整理&#xff0c;你会发现突然渗透思路就有点眉目了。 程序员之间流行一个词&#xff0c;叫35岁危机&#xff0c;&#xf…

OSPF路由策略引入

功能介绍&#xff1a; distribute-list 分发列表&#xff0c;通过distribute-list 工具对路由更新进行控制&#xff0c;只能进行路由条目过滤&#xff0c;不能修改路由的属性。 一、组网要求 在R2上把rip路由重分发进ospf&#xff0c;并且在重分发时进行路由过滤&#xff0c;…

【云原生】Docker-compose单机容器集群编排

内容预知 1.Compose的相关知识 1. Compose的相关概念 2. 为何需要docker-compose docker镜像管理的问题 Docker Compose的解决方案 3. Compose的特征 2. Docker-compose的安装 3. Compose配置常用字段和YAML 文件编写 3.1 YAML 文件格式及编写注意事项 &#xff08;1&…

[附源码]Python计算机毕业设计儿童闲置物品交易网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Java面试题-为什么重写equals就一定要重写hashCode方法呢?

目录 1、为什么要重写equals 方法 2、hashCode 方法 3、为什么要一起重写&#xff1f; 4 原因分析 总结 先放结论&#xff1a; hashCode 和 equals 两个方法是用来协同判断两个对象是否相等的&#xff0c;采用这种方式的原因是可以提高程序插入和查询的速度。如果只重写equ…

第五届传智杯-初赛【A组-题解】

B题&#xff1a; 题目背景 【 题目背景和题目描述的两个题面是完全等价的&#xff0c;您可以选择阅读其中一部分。】 专攻超统一物理学的莲子&#xff0c;对机械结构的运动颇有了解。如下图所示&#xff0c;是一个三进制加法计算器的&#xff08;超简化&#xff09;示意图。…