POJ 1007 DNA Sorting (归并排序)

题意:

输入m个长度为n的DNA序列,把他们按照逆序数从小到大稳定排序输出。

PS:“稳定排序”就是当序列中出现A1==A2时,排序前后A1与A2的相对位置不发生改变。

思路:裸归并排序了  不懂得可以参考下http://blog.csdn.net/morewindows/article/details/6678165/  但是他的代码写错了!后来我按照理解自己写了一个,测了一下是对的!

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;

const int maxn=100+10;
char s1[maxn];

struct node
{
    string s;
    int tot;
}num[maxn];

int a[105];

bool cmp(node x,node y)
{
    return x.tot<y.tot;
}

int b[maxn];
int Count;

void Merge(int *a, int start, int mid , int end)  //归并排序的合并部分
{
	int i = start,j = mid + 1,k = start;
	while(i <= mid&&j <= end)
	{
		if(a[i] <= a[j])
		{
			b[k++] = a[i++];
		}
		else
		{
			Count += j - k;
			b[k++] = a[j++];
		}
	}
	while(i <= mid)
	{
		b[k++] = a[i++];
	}
	while(j <= end)
	{
		b[k++] = a[j++];
	}
	for(int i = start; i <= end; i++)
	{
		a[i] = b[i];
	}
}

void MergeSort(int *a, int start, int end)
{
	if(start < end)
	{
		int mid = (start + end)/2;
		MergeSort(a,start,mid);
		MergeSort(a,mid+1,end);
		Merge(a,start,mid,end);
	}
}

int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=0;i<m;i++)
    {
        Count=0;
        scanf("%s",s1);
        for(int j=0;j<n;j++)
        {
            a[j]=s1[j]-'A';
        }
        MergeSort(a,0,n-1);
        num[i].s=s1;
        num[i].tot=Count;
    }
    sort(num,num+m,cmp);
    for(int i=0;i<m;i++)
    {
        cout<<num[i].s<<endl;
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-06 20:38:39

POJ 1007 DNA Sorting (归并排序)的相关文章

poj 1007 DNA Sorting (求逆序数)

DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 83069   Accepted: 33428 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 instanc

POJ 1007 DNA Sorting

按逆序数从小到大排序.需要稳定排序.然而依然可以快排 #include <cstring> #include <cstdio> #include <algorithm> using namespace std; const int N = 55; const int M = 104; char str[M][N]; struct point{ int num, id; }p[M]; int n, m; void GetInverse(int id){ int i; in

POJ 1007:DNA排序

AC CODE: 1 import java.util.Scanner; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 Scanner input = new Scanner(System.in); 7 8 // 得到数据 9 int n = input.nextInt(); 10 int m = input.nextInt(); 11 String temp = input.nextLine();

HDU 1379 DNA sorting(求逆序数)

DNA Sorting 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 t

poj 3270 Cow Sorting 置换群 简单题

假设初始状态为 a:2 3 1 5 4 6 则目标状态为 b:1 2 3 4 5 6且下标为初始状态中的3 1 2 4 5 6(a[3],a[1]...) 将置换群写成循环的形式 (2,3,1),(5,4),6就不用移动了. 移动方式2种 1:选循环内最小的数和其他len-1个数交换 2:选整个序列最小的数和循环内最小的数交换,转到1,再换回来. #include<cstdio> #include<queue> #include<algorithm> #include&

poj 3270 Cow Sorting(初涉置换群)

http://poj.org/problem?id=3270 大致题意:给出n个整数,要将它们转化成递增序列,每交换其中两个数的代价是这两个数之和.问排序成功后的最小代价. 该题考察的是置换群知识.在黑书p247上有详细的讲解.总结下置换群,方便复习. 群:给定一个集合G={a,b,c...}和集合G上的二元运算 ·,如果满足封闭性,结合律,存在单位元和逆元,则成集合G在运算'·'之下是一个群. 置换:n个元素1,2,....,n之间的置换可表示为  1     2     3     ...

hdoj 1379 DNA Sorting

DNA Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2231    Accepted Submission(s): 1096 Problem Description One measure of ``unsortedness'' in a sequence is the number of pairs of entr

zju 1188 DNA Sorting

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct node { int a; char s[105]; }p[105]; int cmp(node c,node b) { return c.a<b.a; } int main() { int m,n; int t; scanf("%d",&t); //printf(&q

poj 2778 DNA Sequence(AC自动机+矩阵快速幂)

题目链接:poj 2778 DNA Sequence 题目大意:给定一些含有疾病的DNA序列,现在给定DNA长度,问有多少种不同的DNA序列是健康的. 解题思路:对DNA片段建立AC自动机,因为最多10个串,每个串最长为10,所以最多可能有100个节点,在长度为n时 以每个节点终止的健康字符串个数形成一个状态集,通过AC自动机形成的边可以推导出n+1的状态集,走到单词节点是 非法的,所以同样的我们可以先走到单词节点,但是从单词节点不向后转移.这样可以构造一个矩阵,剩下的就是矩阵 快速幂.注意的一