主题:答案相同,算法相差不大,却不是都能提交通过,Why?
我在PKU的题目1007道<<DNA Sorting>>的做题中,写了以下程序:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int i,j,k,flag,swap;
int len_str,amount_str,rank[51]={0};
char zfu[51][101],temp[51];
cin>>len_str>>amount_str;
for(i=0;i<amount_str;i++)
{
cin>>zfu[i];
for(j=0;j<len_str-1;j++)
for(k=j+1;k<len_str;k++)
if(zfu[i][j]>zfu[i][k])
rank[i]++;
}
for(k=0;k<amount_str-1;k++)
{
flag=k,swap;//flag标记当前rank值最小的下标
for(i=k+1;i<amount_str;i++)
{
if(rank[i]<rank[flag])
flag=i;
}
swap=rank[k];
rank[k]=rank[flag];
rank[flag]=swap;
strcpy(temp,zfu[k]);
strcpy(zfu[k],zfu[flag]);
strcpy(zfu[flag],temp);
}
for(k=0;k<amount_str;k++)
cout<<zfu[k]<<endl;
return 1;
}
答案是正确的(至少我认为).但提交时却"Runtime Error".而参考了一些高手的程序后有:
#include <stdio.h>
#include<string.h>
void main()
{
int n,m,i,j,k,a[100];
char dna[101][51],temp[51];
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%s",dna[i]);
for(j=0;j<n-1;j++)
for(k=j+1;k<n;k++)
if(dna[i][j]>dna[i][k])
a[i]++;
}
for(j=m-1;j>0;j--)
for(k=0;k<j;k++)
if(a[j]<a[k])
{
i=a[j];a[j]=a[k];a[k]=i;
strcpy(temp,dna[j]);
strcpy(dna[j],dna[k]);
strcpy(dna[k],temp);
}
for(i=0;i<m;i++)
printf("%s\n",dna[i]);
}
却通过了(Accept).我观察,第一篇程序用的是选择排序,而且排序算法中,在最坏情况下只有一行的赋值运算,交换操作之多也才(amount_str*6)次而第二篇用的是冒泡排序,而且排序算法中,在最坏的情况下,交换次数几乎达到(n^2*6)次.明显应该第一篇通过,而第二篇"Runtime Error",结果却相反.
在下愚昧,想了良久都不得解.诚心请教各位高手,谢谢!
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int i,j,k,flag,swap;
int len_str,amount_str,rank[51]={0};
char zfu[51][101],temp[51];
cin>>len_str>>amount_str;
for(i=0;i<amount_str;i++)
{
cin>>zfu[i];
for(j=0;j<len_str-1;j++)
for(k=j+1;k<len_str;k++)
if(zfu[i][j]>zfu[i][k])
rank[i]++;
}
for(k=0;k<amount_str-1;k++)
{
flag=k,swap;//flag标记当前rank值最小的下标
for(i=k+1;i<amount_str;i++)
{
if(rank[i]<rank[flag])
flag=i;
}
swap=rank[k];
rank[k]=rank[flag];
rank[flag]=swap;
strcpy(temp,zfu[k]);
strcpy(zfu[k],zfu[flag]);
strcpy(zfu[flag],temp);
}
for(k=0;k<amount_str;k++)
cout<<zfu[k]<<endl;
return 1;
}
答案是正确的(至少我认为).但提交时却"Runtime Error".而参考了一些高手的程序后有:
#include <stdio.h>
#include<string.h>
void main()
{
int n,m,i,j,k,a[100];
char dna[101][51],temp[51];
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
scanf("%s",dna[i]);
for(j=0;j<n-1;j++)
for(k=j+1;k<n;k++)
if(dna[i][j]>dna[i][k])
a[i]++;
}
for(j=m-1;j>0;j--)
for(k=0;k<j;k++)
if(a[j]<a[k])
{
i=a[j];a[j]=a[k];a[k]=i;
strcpy(temp,dna[j]);
strcpy(dna[j],dna[k]);
strcpy(dna[k],temp);
}
for(i=0;i<m;i++)
printf("%s\n",dna[i]);
}
却通过了(Accept).我观察,第一篇程序用的是选择排序,而且排序算法中,在最坏情况下只有一行的赋值运算,交换操作之多也才(amount_str*6)次而第二篇用的是冒泡排序,而且排序算法中,在最坏的情况下,交换次数几乎达到(n^2*6)次.明显应该第一篇通过,而第二篇"Runtime Error",结果却相反.
在下愚昧,想了良久都不得解.诚心请教各位高手,谢谢!