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 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. 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 (0 < 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''. Since two strings can be equally sorted, then output them according to the orginal order. Sample Input 10 6
AACATGAAGG
TTTTGGCCAA
TTTGGCCAAA
GATCAGATTT
CCCGGGGGGA
ATCGATGCAT Sample Output CCCGGGGGGA
AACATGAAGG
GATCAGATTT
ATCGATGCAT
TTTTGGCCAA
TTTGGCCAAA

解法一:逆序数+快排(对cmp的完美诠释,原谅我刚刚学)+结构体(第一次在OJ用结构体)——

由于这道题目的数据量不算太大,直接用朴素的求逆序数绝对可以;
逆序数就是看这个数前面有多少个数比当前的数大,这里直接用了一个二重循环;

    #include <iostream>
#include <algorithm>
#include <string>
using namespace std; typedef struct f{
int num;
string w;
}data;
bool cmp( data a, data b ){
return a.num < b.num;
}
int main(){
int i, len, n, j, k;
cin>>len>>n;
data *s = new data[n];
for(i = ; i < n; i++){
s[i].num = ;
cin>>s[i].w;
for(j = ; j < len; j++)
for(k = ; k < j; k++)
if(s[i].w[j] < s[i].w[k])//求逆序数
s[i].num++;
}
sort(s, s+n, cmp);
for(i = ; i < n; i++)
cout<<s[i].w<<endl;
return ;
}

解法二:这里进行求逆序数的有一种方法很巧妙,因为题目中只有4个字母,所以就用到了这种特殊性,我们可以得到O(n)求逆序数的方法;

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
char s[];//储存DNA序列
int sum;//储存每个DNA序列的逆序数
}a[];
bool cmp(node x,node y)//比较函数
{
return x.sum<y.sum;
}
int count_inver(char *str, int len)//求逆序数
{
int i;
int cnt = ;
int a[] = {};//用一个数组个保存字母出现的次数
for(i = len - ; i >= ; i--) {
switch (str[i]) {
case 'A':
a[]++;
a[]++;
a[]++;
break;
case 'C':
a[]++;
a[]++;
cnt += a[];
break;
case 'G':
a[]++;
cnt += a[];
break;
case 'T':
cnt += a[];
}
}
return cnt;
}
int main()
{
int m,n,i,j;
scanf("%d%d",&n,&m);
for(i=;i<m;i++)
{
scanf("%s",a[i].s);
a[i].sum=count_inver(a[i].s,n);
}
sort(a,a+m,cmp);
for(j=;j<m;j++)
printf("%s\n",a[j].s);
}

POJ 1007的更多相关文章

  1. poj 1007 DNA Sorting 解题报告

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

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

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

  3. Mathematics:DNA Sorting(POJ 1007)

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

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

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

  5. poj 1007 (nyoj 160) DNA Sorting

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

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

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

  7. poj 1007 DNA Sorting

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

  8. poj 1007 纯水题 排序

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

  9. POJ 1007 DNA Sorting(sort函数的使用)

    Description One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are ...

随机推荐

  1. iOS开发优秀博客和软件推荐

    iOSBlogAndTools iOS开发优秀博客和软件推荐 本博客和工具列表由广大iOS开发者收集和推荐,如果大家有好的博客或者工具想要分享请点击:我要提交. 收到大家的提交后会及时收录与更新.Gi ...

  2. ie11强制兼容模式打开

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

  3. jdk源码剖析:Synchronized

    开启正文之前,先说一下源码剖析这一系列,就以"死磕到底"的精神贯彻始终,最少追踪到JVM指令(再往下C语言实现了). =========正文分割线===========  Sync ...

  4. GEF开发eclipse插件,多页编辑器实现delete功能

    基于GEF开发,多页签编辑器实现 有两种方案: 方案一 继承FormEditor或MultiPageEditorPart,在其中嵌入自定义的继承自GraphicalEditor的子类的编辑器(作为一个 ...

  5. Java关于e.printStackTrace()介绍

    public void printStackTrace()将此 throwable 及其追踪输出至标准错误流.此方法将此 Throwable 对象的堆栈跟踪输出至错误输出流,作为字段 System.e ...

  6. GreenDao与Rx的完美搭配

    作为Android开发者,一定不会对 GreenDao 和 ReactiveX 陌生. GreenDao   号称Android最快的关系型数据库 ReactiveX    Rx是一个编程模型,目标是 ...

  7. 字典树 Trie树

    什么是Trie树? 形如 其中从根节点到红色节点的路径上的字母所连成的字符串即为一个Trie树上所存的字符串. 比如,这个trie树上有ab,abc,bd,dda这些字符串. 至于怎么构建和查找或添加 ...

  8. [Linux] PHP程序员玩转Linux系列-telnet轻松使用邮箱

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  9. Linux--shell脚本之文本处理工具

    文本处理工具--grep.sed.awk Bash Shell提供了功能强大的文件处理工具:sed(流编辑器stream editor)和awk,都可使用正则表达式进行模式匹配. 而grep又有助于理 ...

  10. setTimeout 倒计时

    <script type="text/javascript"> //设定倒数秒数 var t = 10; //显示倒数秒数 function showTime(){ t ...