zoukankan      html  css  js  c++  java
  • POJ 1007 DNA Sorting

    POj 1007,属于快速排序吧,下面为题目大意


         序列“未排序程度”的一个计算方式是元素乱序的元素对个数。例如:在单词序列“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


    排序程度从好到差就是每个字符串的逆序数从从小到大,如案例输出的第一个字符串的逆序数为6,第二个为10,第三个为11,

    <span style="font-size:12px;"># include<iostream>
    # include<string>
    using namespace std;
    int m;    //定义全局变量,保存st的字符个数,供每个对象使用
    class Str
    {
    public:
    	int num;
    	string st;
    	void count();
    	Str()
    	{
    		num = 0;
    	}
    };
    
    void Str::count()  //计算逆序数
    {
    	int i, j;
    	cin >> st;
    	for (i = 0; i < m - 1; i++)    //使每个字符都与后面的字符进行比较
    	{
    		for (j = i + 1; j < m; j++)
    		{
    			if (st[i]>st[j])
    				num++;     //记录逆序数
    		}
    	}
    }
    
    int main()
    {
    	int n,i,j; 
    	cin >> m >> n;
    	Str temp;
    	Str *p = new Str[n];    //为Str数组动态开辟一段空间,动态分配n个对象空间,并把首地址赋给指针p,Str
    	for (i = 0; i < n; i++)
    	{
    		(p + i)->count(); //调用count函数
    	}
    	//cout << "排序后:" << endl;
    	for (i = 0; i < n-1; i++)  //通过num的大小为Str数组排序
    	{
    		for (j = i + 1; j < n; j++)
    		{
    			if ((p + i)->num >(p + j)->num) //如果前面的大于后面的就进行交换
    			{
    				temp = *(p + i);
    				*(p + i) = *(p + j);
    				*(p + j) = temp;
    			}
    		}
    	}
    	for (i = 0; i < n; i++)
    		cout << (p + i)->st << endl;//通过指针指向的对象访问对象的成员st(和num)
    	delete[]p;  //释放动态开辟的空间
    	return 0;
    }
    </span>

    以上为C++类的做法,没有用到标准库的sort函数,看了网上其他人的做法,如下(此举用了二维数组思想和结构体,以下转载来自HuangLianzheng

    #include<iostream>
    using namespace std;
    int main()
    {int n,m,i,j,num,a[101],b[101],t,k;
    
     char str[101][51],str1[51];
     cin>>n>>m;
     for(i=0;i<m;i++)
     {cin>>str[i];
     num=0;
        for(j=0;j<n-1;j++)
        for(k=j+1;k<n;k++)
      if(str[i][j]>str[i][k])
            num++;
            a[i]=num;}
       for(i=0;i<m;i++)
     {   b[i]=0;
      t=a[0];
     for(j=1;j<m;j++)
     if(t>a[j])
     {t=a[j];
     b[i]=j;}
     a[b[i]]=1250;}   //这里a[b[i]]=1250其实就是把一个足够大(大于  (1+..+49)就行了)的实数付给刚才选出最小的数组元素,使下次的选择不把它包括进来。
      for(i=0;i<m;i++)
       cout<<str[b[i]]<<endl;
      return 0;}

    #include <iostream>
    #include <cstdlib>
    using namespace std;
    struct DNA{
      string s;    
      int value;
    };
    int cmp(const DNA *a, const DNA *b)  {   return (a->value-b->value);   }   
    int main()
    {
        int n,m;
        while(cin>> m >>n)
        {
             DNA it[n];     
             for(int i=0;i!=n;i++)
             {
                cin >> it[i].s;
                it[i].value = 0;
                for(int j=0;j!=m;j++)
                    for(int k=j+1;k!=m;k++)
                         if(it[i].s[j]>it[i].s[k])   it[i].value++;
             }
             qsort(it,n,sizeof(DNA), (int (*)(const void *, const void *))cmp);
             for(int i=0;i!=n;i++)
                  cout << it[i].s <<endl ;             
        }
        return 0;   
    }
    
      实在很优秀,用结构体包含其字符串和对应的inversions个数,从而用快排把inversions和其对应的字符串一次排出。真是优越无比。
    
    这也是我初步认识快排函数和其实现方法。。。
    
    所学到的:1,快排函数的定义和其实现的方法,用结构体可以一次把多项数据通通排出。。
    
                  2,刚开始在后半部分的排序实在花了很多时间,以后不要急着写完代码就抱着侥幸心理去测试AC不AC 要把自己代码的思路全理清,觉得没破绽了才放上去,要不不通过的话又要在调试上面花很多时间,有句话说得好,欲速则不达,切记。。。



  • 相关阅读:
    LINUX学习-Mysql集群-一主多从
    LINUX学习-Mysql集群-主主备份
    LINUX学习-Mysql集群-主从服务器备份
    LINUX学习-Nginx+JDK+Tomcat+Mysql搭建JAVA WEB
    LINUX学习-Nginx实现https
    LINUX学习-Nginx服务器的反向代理和负载均衡
    LINUX学习-PHP安装
    LINUX学习-Mysql安装
    Lens in Scala
    scala中的 Type Lambda
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7256491.html
Copyright © 2011-2022 走看看