北大poj- 1007
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的更多相关文章
- 北大POJ题库使用指南
原文地址:北大POJ题库使用指南 北大ACM题分类主流算法: 1.搜索 //回溯 2.DP(动态规划)//记忆化搜索 3.贪心 4.图论 //最短路径.最小生成树.网络流 5.数论 //组合数学(排列 ...
- poj 1007 DNA Sorting 解题报告
题目链接:http://poj.org/problem?id=1007 本题属于字符串排序问题.思路很简单,把每行的字符串和该行字符串统计出的字母逆序的总和看成一个结构体.最后把全部行按照这个总和从小 ...
- [POJ 1007] DNA Sorting C++解题
DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 77786 Accepted: 31201 ...
- Mathematics:DNA Sorting(POJ 1007)
DNA排序 题目大意:给定多个ACGT序列,按照字母顺序算出逆序数,按逆序数从小到大排列 这题其实很简单,我们只要用一个归并排序算逆序数,然后快排就可以了(插入排序也可以,数据量不大),但是要注意的是 ...
- poj 1007:DNA Sorting(水题,字符串逆序数排序)
DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 80832 Accepted: 32533 Des ...
- poj 1007 (nyoj 160) DNA Sorting
点击打开链接 DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 75164 Accepted: 30 ...
- [POJ] #1007# DNA Sorting : 桶排序
一. 题目 DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 95052 Accepted: 382 ...
- poj 1007 DNA Sorting
DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 95437 Accepted: 38399 Des ...
- poj 1007 纯水题 排序
#include<stdio.h> #include<string.h> #include<algorithm> #include<stdlib.h> ...
- POJ 1007
DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 83069 Accepted: 33428 Descrip ...
随机推荐
- 单源最短路径Dijkstra和优先级算法
百度百科:迪杰斯特拉算法. 代码实现如下: import java.util.Comparator; import java.util.PriorityQueue; import java.util. ...
- JDK7动态代理源码分析
IObject proxy = (IObject) Proxy.newProxyInstance(IObject.class.getClassLoader(), new Class[]{IObject ...
- 服务器与客户端连接 & 聊天机器人
服务器运行当显示 E:\pycharm\python\venv\Scripts\python.exe E:/pycharm/python/协议/机器人聊天服务器.py 开始监听 accept 说明服务 ...
- lumion的物体系统5.30
1.“自然"点击这棵树.可以打开自然库.不同的植物分类有很多页数. 选择一棵树,自动返回页面单击鼠标左键可以种植这个树.成排种树:点击”人群安置“点击我们想安置的起点.再点击终点.用鼠标右键 ...
- Java 中的按值传递
Java 中只有按值传递 "Java 中只有按值传递",初看到这几个字有点不敢相信,无数次通过函数改变过对象,无数次跟同事说 Java 在传对象的时候是按引用传递.后来细细想想,之 ...
- js的回调函数
介绍首先从英文介绍开始 A callback is a function that is passed as an argument to another function and is execut ...
- 《Python量化交易教程》第一部分新手入门 第1天:谁来给我讲讲Python?
一.量化投资视频学习课程 二.Python手把手教学 第1天:谁来给我讲讲Python? PS: 1.注意使用方法,这个以后都有大用 2.注意符号的使用方式 3.尽量用英文表达 4.本日学习内容以及其 ...
- 【转载】安装 gephi 软件
作者:小小爽链接:https://www.zhihu.com/question/21268129/answer/354924066来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- sql查询,更新,删除,操作。
UPDATE ht_plan_triptime pptSET ppt.lock_status = '1'WHERE ppt.lock_status <> '1' AND ppt.pl ...
- union、union all 、distinct的区别和用途
1.从用途上讲 它们都具有去重的效果 2.从效率上讲 distinct通常不建议使用,效率较低;union all 和union 而言,union all效率更高;原因是:union 相当于多表查询出 ...