C代码给出不同的输出

时间:2017-09-25 06:46:45

标签: c

我正在尝试解决代码强制中的问题 - http://codeforces.com/problemset/problem/680/B。我已经在本地解决了它,但是当我将它上传到Code Forces时,它会提供不同的输出。

目前,这是我的代码:

#include <stdio.h>

int main()
{
    int q, pos;
    scanf("%i %i", &q, &pos);
    int cities[q];
    int criminal_count = 0;
    //the greatest distance is naturally the number of cities
    int criminals_by_dist[q];
    for (int i = 0; i < q; ++i)
        criminals_by_dist[i] = 0;

    for (int i = 0; i < q; ++i)
        scanf("%i", &cities[i]);

    //now we have the cites, lets count
    //first the centre
    if (cities[pos - 1] > 0)
        criminals_by_dist[0]++;
    int l = 0, r = 0;
    for (int i = 1; i < q; ++i)
    {
        //count how many on the left of current position
        //first check if it is not out of range
        l = pos - i;
        if (l >= 0)
            criminals_by_dist[i] += cities[l - 1];
        //same with the right
        //first check if it is not out of range
        r = pos + i;
        if (r < q)
            criminals_by_dist[i] += cities[r - 1];
    }

    //count how many criminals can be secured in a particular city
    //the centre is always confirmed because there is only one centre
    criminal_count += criminals_by_dist[0];
    int current = 0;
    for (int i = 1; i < q; ++i)
    {
        current = criminals_by_dist[i];
        if ((current == 2 || (pos - i - 1 >= 0 != pos + i - 1 < q)))
            criminal_count += current;
    }
    printf("%i", criminal_count);
    return 0;
}

在我的控制台中,我输入以下输入:

6 3
1 1 1 0 1 0

,输出为:

3

但是,在代码强制中,会发生以下情况:

输入

6 3
1 1 1 0 1 0

输出

1998776724

答案

3

这是完全相同的代码。为什么会这样?

1 个答案:

答案 0 :(得分:0)

你的算法不太正确。

在这一行

l = pos - i;

l在某些时候变得小于1,因此您可以访问未定义行为的城市。

像这样修改:

 #include <assert.h>
 ...
//count how many on the left of current position
//first check if it is not out of range
l = pos - i;
assert(l > 0);                                // <<< add this line
if (l >= 0)
  criminals_by_dist[i] += cities[l - 1];

再次运行您的程序,您将看到会发生什么。