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 要把自己代码的思路全理清,觉得没破绽了才放上去,要不不通过的话又要在调试上面花很多时间,有句话说得好,欲速则不达,切记。。。



  • 相关阅读:
    poj 2584 T-Shirt Gumbo (二分匹配)
    hdu 1757 A Simple Math Problem (乘法矩阵)
    矩阵之矩阵乘法(转载)
    poj 2239 Selecting Courses (二分匹配)
    hdu 3661 Assignments (贪心)
    hdu 1348 Wall (凸包)
    poj 2060 Taxi Cab Scheme (二分匹配)
    hdu 2202 最大三角形 (凸包)
    hdu 1577 WisKey的眼神 (数学几何)
    poj 1719 Shooting Contest (二分匹配)
  • 原文地址:https://www.cnblogs.com/mingrigongchang/p/6246342.html
Copyright © 2011-2022 走看看