DNA排序
逆序数可以用来描述一个序列混乱程度的量。例如,“DAABEC”的逆序数为5,其中D大于他右边的4个数,E大于他右边的1个数,4+1=5;又如,“ZWQM”的逆序数为3+2+1+0=6。
现在有许多长度一样的字符串,每个字符串里面只会出现四种字母(A,T,G,C)。要求编写程序,将这些字符串按照他们的逆序数进行排序。
输入:
输入数据有多组,以EOF结束。其中,每组数据:
第一行包括两个正整数,第一个正整数N给出了字符串的长度,第二个正整数M给出了字符串的数量。(1<=N,M<=100)
输出:
输出每组数据,不需要额外空行。
将输入的字符串按照其逆序数进行排序,如果两个字符串的逆序数相等,则按照输入中两者先后顺序进行排序。

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 = ; 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 = ; 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 = , C = , G = ;
dna->unsortedness = ;
for(i = dnaLen - ; i >= ; 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 = ; while(i < mid && j <= right)
{
if(SortCmp(&array[i*elemSize], &array[j*elemSize]) <= )
{
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+)*elemSize);
} void MergeSort(void* array, int arrayLen, int elemSize, int (*SortCmp)(const void*, const void*))
{
int loop, left, mid, right = ; for(loop = ; loop < arrayLen; loop *= )
{
left = ;
right = ;
while(right < arrayLen - )
{
mid = left + loop;
right = (mid + loop - > arrayLen - ) ? (arrayLen - ) : (mid + loop - );
Merge((char*)array, elemSize, left, mid, right, SortCmp);
left = left + loop * ;
}
}
} void ProcDnaSequence(DnaSequence *dnaSeq)
{
int i;
int elemSize = sizeof(dnaSeq->pDna[]); for(i = ; 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 ;
}

北大poj- 1007的更多相关文章

  1. 北大POJ题库使用指南

    原文地址:北大POJ题库使用指南 北大ACM题分类主流算法: 1.搜索 //回溯 2.DP(动态规划)//记忆化搜索 3.贪心 4.图论 //最短路径.最小生成树.网络流 5.数论 //组合数学(排列 ...

  2. poj 1007 DNA Sorting 解题报告

    题目链接:http://poj.org/problem?id=1007 本题属于字符串排序问题.思路很简单,把每行的字符串和该行字符串统计出的字母逆序的总和看成一个结构体.最后把全部行按照这个总和从小 ...

  3. [POJ 1007] DNA Sorting C++解题

        DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 77786   Accepted: 31201 ...

  4. Mathematics:DNA Sorting(POJ 1007)

    DNA排序 题目大意:给定多个ACGT序列,按照字母顺序算出逆序数,按逆序数从小到大排列 这题其实很简单,我们只要用一个归并排序算逆序数,然后快排就可以了(插入排序也可以,数据量不大),但是要注意的是 ...

  5. poj 1007:DNA Sorting(水题,字符串逆序数排序)

    DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 80832   Accepted: 32533 Des ...

  6. poj 1007 (nyoj 160) DNA Sorting

    点击打开链接 DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 75164   Accepted: 30 ...

  7. [POJ] #1007# DNA Sorting : 桶排序

    一. 题目 DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 95052   Accepted: 382 ...

  8. poj 1007 DNA Sorting

    DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 95437   Accepted: 38399 Des ...

  9. poj 1007 纯水题 排序

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

  10. POJ 1007

    DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 83069 Accepted: 33428 Descrip ...

随机推荐

  1. locust启动命令

    locust运行测试脚本 locust -f .\load_test.py --host=https://www.baidu.com -f 指定性能测试脚本文件. --host 指定被测试应用的URL ...

  2. 蓝鲸DevOps深度解析系列(2):蓝盾流水线初体验

    关注嘉为科技,获取运维新知 前面一篇文章<蓝鲸DevOps深度解析系列(1):蓝盾平台总览>,我们总览了蓝鲸DevOps平台的背景.应用场景.特点和能力: ​ 接下来我们继续解析蓝盾平台的 ...

  3. 网页中嵌入google地图

    一丶前言 大致需求:美国地图中标记分布的仓库图钉(鼠标经过显示地址详情),通过输入寄收件地邮编来在地图上定位位置添加图钉,将寄件地,选择的仓库,收件地图钉折线相连接,表示大致路线. 一丶google开 ...

  4. classList用法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Octopus501工作站环境配置

    操作系统 Ubuntu18.04LTS(Ubuntu16.04) 远程桌面 Xtce4桌面系统(mate桌面系统)+vncserver远程桌面服务器 远程ssh连接登录 ssh服务器 文件系统 vsF ...

  6. ie8遇到的那些事

    IE一直是我们津津乐道的浏览器,他的奇葩想必各位在开发之路上都不断的遇到了,其恶心程度就不必说了,我们公司主要是IE的浏览器,这次我就把我遇到的不兼容问题列举下来,欢迎大家补充.此举只发表IE8以上的 ...

  7. Oracle单机Rman笔记[3]---RMAN脱机备份及命令基础介绍

    A.NOARCHIVELOG模式下的物理备份 1.完全关闭数据库 2.备份所有的数据库文件.控制文件.联机重做日志 3.重新启动数据库 B.RMAN的体系结构概述 重新构建控制文件: 将控制文件备份为 ...

  8. Public_1.bat

    :: targetset targetFileName=Public_2set targetPath=./:: sourceset sourceFileName=Public_1@echo ui ru ...

  9. oracle如何调试存储过程

    oracle如果存储过程比较复杂,我们要定位到错误就比较困难,那么可以存储过程的调试功能 先按简单的存储过程做个例子,就是上次做的存储过程(proc_test) 1.先在数据库的procedures文 ...

  10. lr添加md5方法,字符编码转换,urlcode编码化

    1.使得写lr脚本时可调用md5方法,需要进行以下操作: 1)将md5.h文件加载到Extra Files下: 2)在globals.h文件中添加  #include“md5.h” 3).打开md5文 ...