首页 > 解决方案 > 为什么我的 Ptice 代码会遇到运行时错误?

问题描述

我是编程新手,我想尽可能多地学习。我正在研究 Kattis 上的问题 Ptice(链接到问题)。

现在我的编程之旅中的问题是我创建了我认为可行的代码,但是当我通过 Kattis 传递它时,它中途拒绝了我的解决方案等。下面的代码通过了 19 个测试用例中的 3 个。(在第 4 种情况下,它遇到运行时错误)

如果有人可以看看为什么我的逻辑不起作用/中断,那将是超级友好的。我很想知道我做错了什么,这样我就可以改进我的编程。:)

#include <iostream>
#include <string>

int main()
{
    int numCharacters;
    std::string inputSequence;
    std::string 
        Adrian =
        "ABCABCABCABC",
        Bruno =
        "BABCBABCBABC",
        Goran =
        "CCAABBCCAABB";

    int pointsForAdrian = 0, pointsForBruno = 0, pointsForGoran = 0;

    std::cin >> numCharacters;
    std::cin >> inputSequence;

    for (int i = 0; i < numCharacters; i++)
    {
        if (inputSequence.at(i) == Adrian.at(i))
        {
            pointsForAdrian++;
        }
        if (inputSequence.at(i) == Bruno.at(i))
        {
            pointsForBruno++;
        }
        if (inputSequence.at(i) == Goran.at(i))
        {
            pointsForGoran++;
        }
    }

    if (pointsForAdrian >= pointsForBruno && pointsForAdrian >= pointsForGoran)
    {
        std::cout << pointsForAdrian << std::endl;
        std::cout << "Adrian" << std::endl;
    }
    
    if (pointsForBruno >= pointsForAdrian && pointsForBruno >= pointsForGoran)
    {
        if (pointsForAdrian == pointsForBruno || pointsForBruno == pointsForGoran){
            std::cout << "Bruno" << std::endl;  
        }
        else {
        std::cout << pointsForBruno << std::endl;
        std::cout << "Bruno" << std::endl;
        }

    }
    if(pointsForGoran >= pointsForAdrian && pointsForGoran >= pointsForBruno)
    {
        if (pointsForAdrian == pointsForGoran || pointsForBruno == pointsForGoran)
        {
            std::cout << "Goran" << std::endl;
        }
        else {
        std::cout << pointsForGoran << std::endl;
        std::cout << "Goran" << std::endl;
        }
    }
    return 0;
}

标签: c++

解决方案


这三个人的答案序列各有 12 个字符长。

如果输入字符串是 12 个字符或更少,那很好。

但是,如果输入的字符串长度为 13 个或更多字符(最多可以为 100 个字符,如竞赛文本中所述),则该行

if (inputSequence.at(i) == Adrian.at(i))

将输入与答案序列末尾的字符进行比较,如下所示:

 Index:  0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
 Input:  A A A A A A A A A A  A  A  A  A  A
 Adrian: A B C A B C A B C A  B  C

对于一切都可以,但是对于i = 0您尝试比较过去 Adrians 字符串的字符。i = 11i = 12

您必须使您的答案序列更长才能起作用,或者更好的是,将它们保持原样,但更改所有三个比较,如下所示:

if (inputSequence.at(i) == Adrian.at(i % 12))

所以它只是在序列的开头重新开始(因为12 % 12是 0,13 % 12是 1,...i % 12计算i除以 12 的余数)。


推荐阅读