POJ 1007 DNASORT原题链接:POJ1007!!
这道题就是表面看上去的那么简单,直接做就可以了,我做这道题的时候,遇到了一个细节上的问题,可能是之前学习的时候没有学好;是关于sort函数,与qsort函数的
例如用 排序
qsort函数内的cmp 函数,判断的返回值是 一个整数
int cmp(const void *a,const void *b)
{
Node *x=(Node *)a;
Node *y=(Node *)b;
return x->num-y->num;
}
x->num-y->num; 则代表是从小到大排序,为负数则不动,为正数则交换,相等不交换
y->num-x->num ;则代表是从打到小排序,为负数则不动,为正数则交换,相等不交换
其实从大到小也可以这样写 return -(x->num-y->num);
但是sort函数内置的cmp函数就不一样了,返回值不是一个整型,而是bool型
bool cmp(Node& a,Node& b)
{
return a.num<b.num;
}
a.num<b.num;则代表从小到大排序; true则不交换,false交换
a.num>b.num;则代表从大到小排序;true 则不交换,false 交换
我这里犯了错误就是,用减法,不管大小与否,只要不是相等都会返回一个非零值,非零值即为true 也就是说除了相等情况,判断永远返回true,这就造成了你可能会发现使用了sort函数,跟没使用是一样的。。。
。。。为此,我wa了两发。。。细节没处理好, 我认了…
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Node
{
char str[55];
int num;
bool operator <(const Node &a)const
{
return num<a.num;
}
}node[105];
int n,m;
int runnum(char* s)
{
int a,c,g,ans;
a=c=g=ans=0;
for(int i=n-1;i>=0;i--)
{
switch(s[i])
{
case 'a':case 'A':a++;break;
case 'c':case 'C':c++;ans+=a;break;
case 'g':case 'G':g++;ans+=a;ans+=c;break;
case 'T':case 't':ans+=a;ans+=c;ans+=g;break;
}
}
return ans;
}
/*
int cmp(const void *a,const void *b)
{
Node *x=(Node *)a;
Node *y=(Node *)b;
return x->num-y->num;
}
*/
int cmp(Node& a,Node& b)
{
return a.num<b.num;
}
void go()
{
while(cin>>n>>m)
{
for(int i=0;i<m;i++)
{
cin>>node[i].str;
node[i].num=runnum(node[i].str);
}
sort(node,node+m);
// qsort(node,m,sizeof(Node),cmp);
for(int i=0;i<m;i++)
{
cout<<node[i].str<<endl;
}
}
}
int main()
{
go();
return 0;
}