C++之OPJ-2

来源:互联网 发布:爱情守望者 mac 编辑:程序博客网 时间:2024/05/16 12:04

1007:DNA排序

总时间限制:
1000ms
内存限制:
65536kB
描述
现在有一些长度相等的DNA串(只由ACGT四个字母组成),请将它们按照逆序对的数量多少排序。
逆序对指的是字符串A中的两个字符A[i]、A[j],具有i < j 且 A[i] > A[j] 的性质。如字符串”ATCG“中,T和C是一个逆序对,T和G是另一个逆序对,这个字符串的逆序对数为2。


输入
第1行:两个整数n和m,n(0<n<=50)表示字符串长度,m(0<m<=100)表示字符串数量

第2至m+1行:每行是一个长度为n的字符串
输出
按逆序对数从少到多输出字符串,逆序对数一样多的字符串按照输入的顺序输出。
样例输入
10 6AACATGAAGGTTTTGGCCAATTTGGCCAAAGATCAGATTTCCCGGGGGGAATCGATGCAT
样例输出
CCCGGGGGGAAACATGAAGGGATCAGATTTATCGATGCATTTTTGGCCAATTTGGCCAAA

由于刚刚写C++,自己用了三个小时写的代码还是有很多问题,而且过于“臃肿”, 还是转载一篇大神的代码吧···

#include<iostream>#include<cstdio>  #include<cstring>  #include<algorithm>  #include<assert.h>  #include<ctype.h>  #include<cstdlib> #define MAX 10000using namespace std;struct tn{  char s[54];  int asc;}d[105];bool compare(tn a, tn b){  return a.asc < b.asc;}int main(){  int i, j, k, n, m;  cin >> n >> m;  for (i = 0; i < m; i++)  {    cin >> d[i].s;  }  for (i = 0; i < m; i++)  {    d[i].asc = 0;    for (j = 0; j < n; j++)    {      for (k = j; k < n; k++)      {        if (d[i].s[k] < d[i].s[j])          d[i].asc++;      }    }    sort(d, d + m, compare);    for (i = 0; i < m; i++)    {      cout << d[i].s << endl;    }  }  return 0;}


0 0