C ++代码厨师的错误答案

时间:2014-08-03 21:21:33

标签: c++

问题:http://www.codechef.com/problems/LEBOMBS

我已经尝试过每一个我想到的测试用例。但它仍然给出了错误的答案。我不知道为什么。 请指出我的代码中是否有任何错误。这是我的代码。

#include <iostream>
using namespace std;
int main() {
    int t, i, total, n;
    char a[1001];
    cin >> t;
    while (t--) {
        i = 0;
        cin >> n;
        total = n;
        cin >> a;
        while (i < n) {
            if (a[i] == '1') {
                if (i == '0')
                    total -= 2;

                else if (i == 1) {
                    if (a[i - 1] == '1')
                        total--;
                    else
                        total -= 3;
                } else if (i > 1 && i < n - 1) {
                    if (a[i - 1] == '1')
                        total--;
                    else if (a[i - 2] == '1')
                        total -= 2;
                    else
                        total -= 3;
                } else {
                    if (a[i - 1] == '1')
                        ;
                    else if (a[i - 2] == '1')
                        total--;
                    else
                        total -= 2;
                }
            }
            i++;
        }
        if (total < 0)
            total = 0;
        cout << total << "\n";
    }

    return 0;
}

P.S。如果您看到代码,则会出现一行“if(total&lt; 0)total = 0;”这是因为当建筑物的数量等于1或2时,因为这种情况给出了我写的代码的错误答案,但之后它给出了错误的答案。请帮忙。

有什么方法可以让我如何看待可能违反我的代码以供将来参考的测试用例?

1 个答案:

答案 0 :(得分:4)

你的方法非常复杂,我不确定为什么会那样:

bool bombs_nearby(char *bombs, int length, int index) {
    if (length == 1)
        return bombs[0] == '1';
    if (index == 0)
        return bombs[0] == '1' || bombs[1] == '1';
    if (index == length - 1)
        return bombs[length - 1] == '1' || bombs[length - 2] == '1';
    return bombs[index - 1] == '1' || bombs[index] == '1' || bombs[index + 1] == '1';
}

int remaining_buildings(char *bombs, int length) {
    int total = 0;
    for (int i=0; i<length; ++i)
        if (!bombs_nearby(bombs, length, i))
            total++;
    return total;
}

测试用例代码就是:

cin >> n >> a;
cout << remaining_buildings(a, n) << "\n";

测试用例

此外,这是一个失败的测试用例:

1 49 0101100010101110000101111101101010011010001100111

正确答案为4,但您只声称2房屋将存活。

为什么您的代码会失败?

所以,我花了一些时间重新阅读你的代码。它实际上并不是一种方法。我想如果有评论描述你想要做什么,那么你会如何理解它。

可悲的是,你所有的痛苦都归咎于非常小错误:

    while (i < n) {
        if (a[i] == '1') {
            if (i == '0')
                total -= 2;

请注意,您要测试i == '0'。你的意思是i == 0。你应该测试你不是第0个索引,而不是i'0'个字符。