SPOJ:KURUK14的这两个答案有什么区别

SPOJ: What is the difference between these two answers for KURUK14

本文关键字:两个 答案 区别 什么 KURUK14 SPOJ      更新时间:2023-10-16

我已经解决了这个问题,得到了AC。我的问题与以下两种方法的等价性有关。第一个代码被接受了,而第二个没有。据我所知,对于任何人能想到的所有(有效)测试用例,两者都是完全等效的。我错了吗?如果是,什么测试用例可以区分它们?

代码#1(已接受):

#include <cstdio>
bool* M;
bool proc(int N){
    for(int j=0;j<=N;j++){
        M[j]=false;
    }
    for(int i=0;i<N;i++){
        int a=0;
        scanf("%d",&a);
        if(a>=N)
            return false;
        else if(!M[a])
            M[a]=true;
        else if(!M[N-1-a])
            M[N-1-a]=true;
    }
    bool f = true;
    for(int k=0;k<N;k++)
    {
        f = f && M[k];
    }
    return f;
}
int main() {
    M=new bool[1002];
    int num=0;
    scanf("%d",&num);
    while(num){
        int N=0;
        scanf("%d",&N);
        if(proc(N))
            printf("YESn");
        else
            printf("NOn");
        num--;
    }
    return 0;
}

代码#2(WA):

#include <cstdio>
bool* M;
bool proc(int N){
    for(int j=0;j<=N;j++){
        M[j]=false;
    }
    for(int i=0;i<N;i++){
        int a=0;
        scanf("%d",&a);
        if(a>=N)
            return false;
        else if(!M[a])
            M[a]=true;
        else if(!M[N-1-a])
            M[N-1-a]=true;
        else
            return false;
    }
    return true;
}
int main() {
    //Exactly same as code#1
}

错误与算法本身无关—很有可能这两种算法都是正确的。但是第二个实现是错误的。

当您到达一个应该返回NO的测试用例时,您会提前退出该函数。这意味着输入中有一些来自当前测试用例的数字未读,这当然会彻底混淆进一步的阅读。这意味着错误仅在T > 1时显现。

相关文章: