2017-09-25 126 views
-1

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

目前,这是我的代码:

#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 

然而, codeforces,会发生以下情况:

输入

6 3 
1 1 1 0 1 0 

输出

1998776724 

回答

3 

它是所有相同的代码。为什么会发生?

+0

请解释你的代码应该做什么。 – Yunnosch

+3

'if(l> = 0)criminals_by_dist [i] + = cities [l-1];'是错的。如果'l == 0'呢?那么“l-1”是什么?稍后在同一个循环中与'r'相同。 –

+1

'if(l> = 0)criminals_by_dist [i] + = cities [l-1];'可能导致出界限访问。 –

回答

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]; 

再次运行程序,你会看看会发生什么。