回 帖 发 新 帖 刷新版面

主题:答案相同,算法相差不大,却不是都能提交通过,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",结果却相反.
在下愚昧,想了良久都不得解.诚心请教各位高手,谢谢!

回复列表 (共2个回复)

沙发

你可以去看看关于算法的时间代价的叙述
他们的时间代价都是相同的级别o(n^2)

板凳

谢谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册