您的位置:首页 > 其它

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

2011-05-13 18:51 363 查看
这道题目的关键在于将逆序数目和数据结合在一起。

这里我提供两个方法。
方法一:将数据和逆序数目整合一起,要学会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
;
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
;
int *countDNA=new int
;
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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: