POJ 1007DNA Sorting解题报告——【PKU ACM】

这道题目的关键在于将逆序数目和数据结合在一起。

这里我提供两个方法。
方法一:将数据和逆序数目整合一起,要学会qsort函数的使用
#include<iostream> #include<string> #include <cstdlib> using namespace std; class DNA{ public: string seqDNA; int num; }; int compare(const void *p1, const void *p2){ return(((DNA*)p1)->num-((DNA*)p2)->num); } int main(){ DNA *dna; int n,m,num,count(0); string listDNA; cin>>m>>n; dna=new DNA[n]; while(count<n){ cin>>listDNA; num=0; for(int i=0;i<m-1;++i){ //寻找逆序数目 for(int j=i+1;j<m;++j){ if(listDNA.at(i)>listDNA.at(j)) ++num; } } dna[count].num=num; dna[count++].seqDNA=listDNA; } qsort(dna,n,sizeof(DNA),compare); //根据逆序数目进行快速排序 for(int i=0;i<n;++i) cout<<dna[i].seqDNA<<endl; delete []dna; return 0; }
方法二:巧妙的将逆序数目与int型数组结合
//非常绝妙的绑定方法
#include<iostream> #include<string> #include<cstdlib> using namespace std; int compare(const void *p1, const void *p2){ return(*(int*)p1-*(int*)p2); } int main(){ string listDNA; int m,n,num; cin>>m>>n; string *seqDNA=new string[n]; int *countDNA=new int[n]; for(int k=0;k<n;++k){ cin>>listDNA; num=0; for(int i=0;i<m-1;++i) for(int j=i+1;j<m;++j) if(listDNA.at(i)>listDNA.at(j)) ++num; *(seqDNA+k)=listDNA; *(countDNA+k)=num*1000+k; } qsort(countDNA,n,sizeof(int),compare); for(int i=0;i<n;++i) cout<<seqDNA[countDNA[i]%1000]<<endl; delete []seqDNA; delete []countDNA; return 0; }
POJ 1007DNA Sorting解题报告——【PKU ACM】_第1张图片

你可能感兴趣的:(POJ 1007DNA Sorting解题报告——【PKU ACM】)