hdu1379DNA Sorting解题报告

本文介绍了DNA排序问题,给出了一种解决方案,通过计算DNA序列的逆序对数量来衡量其排序度,并使用稳定排序算法对序列进行排序。提供了一个C++代码示例,展示如何实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一、    问题描述

DNA Sorting

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 588    Accepted Submission(s): 313

Problem 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.


This problem contains multiple test cases!

The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank line between input blocks.

The output format consists of N output blocks. There is a blank line between output blocks.

 

 

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 (1 < 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''. If two or more strings are equally sorted, list them in the same order they are in the input file.

 

 

Sample Input

1

 

10 6

AACATGAAGG

TTTTGGCCAA

TTTGGCCAAA

GATCAGATTT

CCCGGGGGGA

ATCGATGCAT

 

 

Sample Output

CCCGGGGGGA

AACATGAAGG

GATCAGATTT

ATCGATGCAT

TTTTGGCCAA

TTTGGCCAAA

二、    问题分析与算法实现

直接模拟利用STL里面的稳定排序函数给结构体排序。

陈元杰 2009-11-14 整理

三、    参考代码

#include <iostream>

#include <string>

#include <stdio.h>

#include <algorithm>

#include <stdlib.h>

using namespace std;

 

struct dna // DNA结构声明

{

    char s[50];

    int num; // 记录每组DNA “数字”

};

dna Dna[100];

 

bool op(dna a,dna b) // 比较函数,即说明升序还是降序排列。

{

    return a.num<b.num;

}

int main()

{

    int T,n,m;

    scanf("%d",&T);

    while(T--)

    {

        scanf("%d%d",&n,&m);

        for(int i=0;i<m;i++)

        {

            int num=0;  // 数字归零,便于下一组DNA记录。

            scanf("%s",Dna[i].s);

            for(int j=0;j<n-1;j++) // 计算每组DNA的“数字”

            {

                for(int k=j+1;k<n;k++)

                {

                    if( Dna[i].s[j]>Dna[i].s[k] )

                    num++;

                }

            }

            Dna[i].num=num; //  记录每组DNA的“数字”

        }

        stable_sort(Dna,Dna+m,op); //调用稳定排序函数stable_sort排序DNA结构体。

        for(int x=0;x<m;x++)

        {

            printf("%s/n",Dna[x].s);

        }

        if(T>0) // 控制输出格式

        cout<<endl;

    }

return 0;

}

}

陈元杰 2009-11-14 整理

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值