我做了一些算法练习,遇到了一个奇怪的问题。我编写了下面的代码来解决这个问题http://main.edu.pl/en/archive/oi/21/pta。我测试了它,看起来它在调试模式下工作正常,但是一旦我切换到Release(或将其提交到网站),它就会给出一些测试的错误答案。
例如对于9e.in(我在这里上传了这个测试:https://www.dropbox.com/s/ki4vfk2p5140xwo/pta9e.in?dl=0)我从Debug构建中获得的答案是正确的:
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
但是,在发布中(以及提交到网站后),我得到:
543
530
530
530
530
530
543
530
530
530
543
530
530
543
530
530
530
543
530
530
543
530
530
530
530
我不知道是什么导致了这个问题:/这是我的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdlib>
#include <queue>
#include <cmath>
#include <stdio.h>
using namespace std;
int numOfTrees = 0;
int* trees = NULL;
int numOfBirds = 0;
int computeBird(int birdStamina)
{
int tired = 0;
int position = 0;
int lastTree = 0;
while (true)
{
if (position >= numOfTrees - 1)
{
return tired;
}
lastTree = trees[position];
int furthestGoodTree = -1;
int tallestTreePos = position + birdStamina;
if (tallestTreePos > numOfTrees - 1)
{
tallestTreePos = numOfTrees - 1;
}
int tallestTreeSize = trees[tallestTreePos];
for (int n = 1; n <= birdStamina; ++n)
{
int pos = position + n;
if (pos >= numOfTrees)
break;
if (trees[pos] < lastTree)
{
if (trees[pos] >= trees[furthestGoodTree])
{
furthestGoodTree = pos;
}
}
if (trees[pos] >= tallestTreeSize)
{
tallestTreeSize = trees[pos];
tallestTreePos = pos;
}
}
if (furthestGoodTree != -1)
{
position = furthestGoodTree;
}
else
{
position = tallestTreePos;
tired++;
}
}
}
int main()
{
scanf("%d", &numOfTrees);
trees = new int[numOfTrees + 2];
int val = 0;
for (int n = 0; n < numOfTrees; ++n)
{
scanf("%d", &val);
trees[n] = val;
}
scanf("%d", &numOfBirds);
int* cache = new int[numOfTrees + 2];
for (int n = 0; n < numOfTrees; ++n)
{
cache[n] = -1;
}
int results[30];
int birdStamina = 0;
for (int n = 0; n < numOfBirds; ++n)
{
scanf("%d", &birdStamina);
if (cache[birdStamina] != -1)
{
results[n] = cache[birdStamina];
}
else
{
int result = computeBird(birdStamina);
cache[birdStamina] = result;
results[n] = result;
}
}
for (int n = 0; n < numOfBirds; ++n)
{
printf("%d\n", results[n]);
}
//system("pause");
return 0;
}
答案 0 :(得分:0)
这段代码真的应该有我添加的断言
if (trees[pos] < lastTree)
{
assert( furthestGoodTree >= 0 );
if (trees[pos] >= trees[furthestGoodTree])
{
furthestGoodTree = pos;
}
}
据我所知,这种情况与数据有关,不受其他代码的强制,当然也不是任何本地代码所强制的。
当你依赖某些条件为真并且本地不明显为什么它应该是真的时,你应该有一个assert
所以调试运行会注意到不正确的假设。
答案 1 :(得分:-1)
我不确定您输入了什么输入数据,但在我看来,您已超出数组边界。例如,您将缓存分配为 numOfTrees 的数组,但稍后会按索引 numOfBirds 读取它。我假设发布和调试版本具有不同的内存分配,因此您的超出边界读取会给您不同的结果。