POJ1007-DNA Sorting
2011-07-30 21:12
323 查看
转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1309425334
大致题意:[/b]
输入m个长度为n的DNA序列,把他们按照逆序数从小到大稳定排序输出。
PS:“稳定排序”就是当序列中出现A1==A2时,排序前后A1与A2的相对位置不发生改变。
解题思路:[/b]
没难度,先求各个字符串的逆序数,再按逆序数对字符串快排,用qsort()函数。
虽然快排不是稳定的排序,但是只要在定义排序规则函数cmp做适当处理,a==b时返回0,即不处理a和b,就不会改变他们之间的相对位置了。
大致题意:[/b]
输入m个长度为n的DNA序列,把他们按照逆序数从小到大稳定排序输出。
PS:“稳定排序”就是当序列中出现A1==A2时,排序前后A1与A2的相对位置不发生改变。
解题思路:[/b]
没难度,先求各个字符串的逆序数,再按逆序数对字符串快排,用qsort()函数。
虽然快排不是稳定的排序,但是只要在定义排序规则函数cmp做适当处理,a==b时返回0,即不处理a和b,就不会改变他们之间的相对位置了。
//Memory Time //252K 16MS #include<iostream> #include<algorithm> using namespace std; typedef class dna { public: int num; //逆序数 char sq[110]; //DNA序列 }DNAStr; int InversionNumber(char* s,int len) { int ans=0; //s逆序数 int A,C,G; //各个字母出现次数,T是最大的,无需计算T出现次数 A=C=G=0; for(int i=len-1;i>=0;i--) { switch(s[i]) { case 'A':A++;break; //A是最小的,无逆序数 case 'C': { C++; ans+=A; //当前C后面出现A的次数就是这个C的逆序数 break; } case 'G': { G++; ans+=A; ans+=C; break; } case 'T': { ans+=A; ans+=C; ans+=G; break; } } } return ans; } int cmp(const void* a,const void* b) { DNAStr* x=(DNAStr*)a; DNAStr* y=(DNAStr*)b; return (x->num)-(y->num); } int main(void) { int n,m; while(cin>>n>>m) { DNAStr* DNA=new DNAStr[m]; for(int i=0;i<m;i++) { cin>>DNA[i].sq; DNA[i].num = InversionNumber(DNA[i].sq,n); } qsort(DNA,m,sizeof(DNAStr),cmp); for(int j=0;j<m;j++) cout<<DNA[j].sq<<endl; } return 0; }
相关文章推荐
- POJ1007 DNA Sorting 排序 C语言
- Poj1007_DNA Sorting(面向对象方法)
- POJ1007 DNA Sorting(求逆序数)
- 【poj1007】DNA Sorting
- POJ1007-DNA Sorting
- POJ1007:DNA Sorting
- POJ1007--DNA Sorting
- POJ1007 DNA Sorting
- POJ1007_DNA Sorting_归并排序求逆序对
- POJ1007 DNA Sorting
- POJ1007 DNA Sorting
- 【poj1007】DNA Sorting
- poj1007(DNA Sorting)
- POJ1007(DNA Sorting)
- POJ1007,DNA Sorting,排序水题
- POJ1007-DNA Sorting-ACM
- POJ1007-DNA Sorting
- poj1007 DNA Sorting(求逆序数)
- poj1007 DNA Sorting 排序
- POJ1007-DNA Sorting-ACM