在线评委答错

Wrong answer in online judge

本文关键字:在线      更新时间:2023-10-16

Codeforces问题131A-http://codeforces.com/problemset/problem/131/A我在Windows 7上使用的是Dev C++5.5.2(我输入的语言是Visual Studio 2010 C++)。尽管我在计算机上运行解决方案时得到了正确的输出,但在Codeforces上的测试用例3中我得到了错误的答案。

法官日志:

est:#3,时间:0毫秒,内存:0 KB,退出代码:0,检查器退出代码:1,判决:WRONG_ANSWER输入cAPSlOCK输出带帽螺钉答复cAPSlOCK检查器日志错误答案第一个单词不同-应为:"cAPSlOCK",找到:"cAPSlOCK"

我的解决方案:

#include<iostream>
using namespace std;
char a[101];
int i,b;
int main()
{
    cin>>a;
    b=a[0];if(b>90)
    {
        b=b-32;
        a[0]=b;
    }
    for(i=1;a[i]!=NULL;i++)
    {
        b=a[i];
        if(b<97)
        {
            b=b+32;
            a[i]=b;
        }
    }
    cout<<a;
}

我应该在我的解决方案中更改什么,以便它也能在在线法官中正确工作?

对于初学者,您应该使用标准函数isupper,等等。(在<ctype.h>中,请记住您必须转换在使用它们之前的任何charunsigned char)。在里面特别是,您的代码似乎假设1)编码ASCII(尽管没有现代机器使用ASCII),以及2)这个单词只包含字母字符。(你也没有检查输入是否成功。)

其次,指定的条件涉及整个字符串,而不是只是第一个字符。只是测试第一个字符不可能足够;必须检查中的每个字符一串(问题的实际规格不是太高清楚的如果有只有一个字母?)

第三,不管结果如何,你都要在变换上循环您的if。这当然是错误的。

第四,你不交换箱子;你只会破坏小于97.

这里有两个独立的问题。首先是确定caps锁定键是否已设置。最简单的方法是类似于:

if ( std::find_if( word.begin() + 1,
                   word.end(),
                   []( unsigned char ch ) { return !isupper( ch ); } )
        == word.end() )

(这是一种简化,因为它对所有一个都返回true字符串。但这是对规格,虽然我觉得不是很直观一个。)

如果您不想使用std::find_if这样的函数应该将其纳入一个单独的函数:

bool
capsLockSet( std::string const& word )
{
    auto current = word.begin() + 1;
    while ( current != word.end()
            && isupper( static_cast<unsigned char>( *current ) ) ) {
        ++ current;
    }
    return current == word.end();
}

类似地,您可以使用std::transform进行转换(仅当以上返回true时才执行),或将循环计算在内成为一个单独的功能;在这两种情况下,第一个字符将需要特殊处理,因为如果是小写必须将其转换为鞋面。(如果您有一个先决条件您将看到的唯一字符是ASCII字母,然后您可以通过CCD_ 8在上限和下限之间切换。我推荐反对它,因为它依赖于编码,事实上,只有信件在场,没有其他信件字符。)

关于"我应该在解决方案中更改什么,使其也能在在线判断中正确工作?"

问题是:只有当单词除第一个字符外都是大写时,才更改单词
错误报告指出:cAPSlOCK应该返回cAPSlOCK,而不是cAPSlOCK
因此,如果不应该更改输入,至少应该在程序中进行检查以输出输入。

关于程序:您可以使用cctype中的助手函数:isupper()islower()toupper()tolower(),这样您和我们就更容易了解发生了什么。