SPOJ:KURUK14的这两个答案有什么区别
SPOJ: What is the difference between these two answers for KURUK14
我已经解决了这个问题,得到了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
时显现。
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 仅通过C++中数组初始化的不同方法,即可在同一输入上获得两个不同的答案
- 如何解决数独问题,以便通过交换任何两个相邻的子网格,我仍然得到有效的答案?
- 为什么 while (cout << A[--N] << && N) 和 while (cout << A[--N] << ) 给了我两个不同的答案,这
- void 函数使用相同的变量打印两个不同的答案
- 当总和本身显示为180时,当我从两个角度的总和中提取180时,我会得到错误的答案
- 创建一个程序,要求用户输入两个数字,并有三个可能的答案.代码未编译.数字(作为int)
- SPOJ:KURUK14的这两个答案有什么区别
- 两个左移操作得到了不同的答案
- 检查类是否派生自特定类(编译,运行时两个答案都可用)
- strtol对两个不同的十六进制字符串给出相同的答案