2017-09-25 229 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]; 

再次運行程序,你會看看會發生什麼。