poj 1007 DNA Sorting【逆序对】

终于可以说:没有那么水了(虽然还是很水)。。。。。。

关于逆序数的题目,开始用塑料的冒泡排序一直WA,后来自己写一个,终于过了,要求是稳定的!!!!!!!

AC的代码:

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

char DNA[105][55];		//输入原DNA序列
int visit[105];

int Inversion(int nTh,int len)
{
	int i,j,count=0;
	for(i=0;i<len;i++)
		for(j=i;j<len;j++)
			if(DNA[nTh][i]>DNA[nTh][j])
				count++;

	return count;
}

int main()
{
	//1A,2B, 3C, 4D, 5E, 6F, 7G, 8H, 9I, 10J, 11K, 12L, 13M, 14N, 15O, 16P, 17Q, 18R, 19S, 20T, 21U, 22V, 23W, 24X, 25Y, 26Z
	int inverNum[102];		//对应每个数列的逆序数
	int n;
	int m;

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

	int i,j;
	for(i=0;i<m;i++)
	{
		scanf("%s",DNA[i]);
		inverNum[i]=Inversion(i,n);		//传入排位第i个的DNA序列,和序列长度

		//test  OK
		//printf("逆序数为:%d\n",inverNum[i]);
	}

	//每次都找到inverNum最小的序列打印,一定是稳定的
	int min;
	int pos;
	for(i=0;i<m;i++)
	{
		min=1000;	//开始放min为一个很大的数
		for(j=0;j<m;j++)
			if(visit[j]==0 && min>inverNum[j])
			{
				min=inverNum[j];
				pos=j;
			}

		visit[pos]=1;	//标记被访问过了
		printf("%s\n",DNA[pos]);
	}

	return 0;
}

WA 2次的代码:

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

char DNA[105][55];		//输入原DNA序列

int Inversion(int nTh,int len)
{
	int i,j,count=0;
	for(i=0;i<len;i++)
		for(j=i;j<len;j++)
			if(DNA[nTh][i]>DNA[nTh][j])
				count++;

	return count;
}

int main()
{
	//1A,2B, 3C, 4D, 5E, 6F, 7G, 8H, 9I, 10J, 11K, 12L, 13M, 14N, 15O, 16P, 17Q, 18R, 19S, 20T, 21U, 22V, 23W, 24X, 25Y, 26Z
	int inverNum[102];		//对应每个数列的逆序数
	int n;
	int m;

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

	int i,j;
	for(i=0;i<m;i++)
	{
		scanf("%s",DNA[i]);
		inverNum[i]=Inversion(i,n);		//传入排位第i个的DNA序列,和序列长度

		//test  OK
		//printf("逆序数为:%d\n",inverNum[i]);
	}

	//直接用冒泡排序(稳定的)
	char tmpN,temp[55];
	for(i=0;i<m;i++)
		for(j=i;j<m;j++)
			if(inverNum[i]>=inverNum[j])
			{
				//交换逆序数
				tmpN=inverNum[j];
				inverNum[j]=inverNum[i];
				inverNum[i]=tmpN;

				//交换DNA序列
				strcpy(temp,DNA[j]);
				strcpy(DNA[j],DNA[i]);
				strcpy(DNA[i],temp);
			}

	for(i=0;i<m;i++)
		printf("%s\n",DNA[i]);

	return 0;
}

中文题目:

题目大意:

     序列“未排序程度”的一个计算方式是元素乱序的元素对个数。例如:在单词序列“DAABEC'”中,因为D大于右边四个单词,E大于C,所以计算结果为5。这种计算方法称为序列的逆序数。序列“AACEDGG”逆序数为1(E与D)——近似排序,而序列``ZWQM'' 逆序数为6(它是已排序序列的反序)。

     你的任务是分类DNA字符串(只有ACGT四个字符)。但是你分类它们的方法不是字典序,而是逆序数,排序程度从好到差。所有字符串长度相同。

输入:

第一行包含两个数:一个正整数n(0<n<=50)表示字符串长度,一个正整数m(0<m<=100)表示字符串个数。接下来m行,每行一个长度为n的字符串。

输出:

输出输入字符串列表,按排序程度从好到差。如果逆序数相同,就原来顺序输出。

样例输入:

10 6

AACATGAAGG

TTTTGGCCAA

TTTGGCCAAA

GATCAGATTT

CCCGGGGGGA

ATCGATGCAT

 

样例输出:

CCCGGGGGGA

AACATGAAGG

GATCAGATTT

ATCGATGCAT

TTTTGGCCAA

TTTGGCCAAA

大致题意:

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

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

时间: 2024-09-17 04:14:41

poj 1007 DNA Sorting【逆序对】的相关文章

POJ:DNA Sorting 特殊的排序

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

[POJ] 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 instance, in the letter seq

如何实现数组中的逆序对

题目: 在数组中的两个数字如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对. 输入一个数组, 求出这个数组中的逆序对的总数. 使用归并排序的方法, 辅助空间一个排序的数组, 依次比较前面较大的数字, 算出整体的逆序对数, 不用逐个比较. 时间复杂度: O(nlogn) 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h>

关于数组中的逆序对

题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组中的元素个数.其中1 <= n <= 10^5. 第二行包含n个整数,每个数组均为int类型. 输出: 对应每个测试案例,输出一个整数,表示数组中的逆序对的总数. 样例输入: 4 7 5 6 4 样例输出: 5 思路:最简单的方法是顺序数组,将每个数字与后面的比较,统计逆序对的个数,这种方法的时间

(算法导论习题解problem2.4)寻找一个序列中逆序对的数量

一个序列的逆序对是这样的两个元素, 对于序列A而言, i>j且A[i]<A[j], 于是A[i]和A[j]就形成一个逆序对. 研究一个序列中逆序对的数量是有实际意义的, 对于插入排序而言, 它排序的时间与待排序序列的逆序对数量成正比. 下面给出求出一个序列中逆序对数量的算法,类似于归并排序中使用的分治算法:一个序列的逆序对数量为它的左半部分逆序对的数量,加上右半部分逆序对的数量, 最后在合并的时候左半部分元素大于右半部分元素的数量.这几乎和归并算法的过程一模一样,只是在归并的时候加入了计数的操

cf 204 div2 D. Jeff and Furik 逆序对

     又一次看错题意--题目是两个人,一个人自己主观选择,一个人抛硬币,因为算期望,所以抛硬币那人可以无视掉,求出逆序对个数m,m为奇答案是2m-1,否则2m     太囧 #include<iostream> #include<cstdlib> #include<cstdio> #include<algorithm> using namespace std; int org[100000]; int c[100000]; int ans=0; void

剑指offer系列之三十四:数组中的逆序对

题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 要找到数组中的逆序对,一种思路是每遍历到一个元素的时候就和后面的元素进行一一比较,这种算法的时间复杂度是O(n2),所以不是很理想.我们可以借鉴归并排序的思想,把数组划分为子数组,然后对每个子数组中的逆序对数进行统计,统计完成后再并到一个新的数组中进行统计,这样就化整为零,实现了高效统计.总计起来思路就是:首先把数组划分为子数组,然后统计子数组中的逆序对数,然后

C++求逆序对的方法_C 语言

本文实例讲述了C++求逆序对的方法,分享给大家供大家参考之用.具体实现方法如下: #include <iostream> #include <vector> using namespace std; int array[] = {3, 9, 7, 4, 5, 2}; const int size = sizeof array / sizeof *array; int temp[size]; //int numbers[size]; int reversePair(int *numb

归并求逆序对【模板】

代码: #include <stdio.h> const int M=999999; int A[500]; int cunt=0; int L[250],R[250]; void Merge(int Left,int Middle,int Right) { int n1=Middle-Left+1; int n2=Right-Middle; for(int i=1;i<=n1;i++) L[i]=A[Left+i-1]; for(i=1;i<=n2;i++) R[i]=A[Mid