在线评判错误答案

时间:2013-12-12 11:51:56

标签: c++

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 ms。,内存:0 KB,退出代码:0,检查退出代码:1,判决结果:WRONG_ANSWER 输入 大写锁定 产量 大写锁定 回答 大写锁定 检查日志 错误答案第一句话有所不同 - 预期:'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;
}

我的解决方案应该如何改变才能在网上判断中正常工作?

2 个答案:

答案 0 :(得分:1)

对于初学者,您应该使用标准函数isupper, 等(在<ctype.h>中 - 只记得你必须转换 使用之前的任何charunsigned char)。在 特别是,你的代码似乎假设1)编码是 ASCII(虽然没有现代机器使用ASCII),2)表示 单词只包含字母字符。 (你也没能 检查输入是否成功。)

其次,指定的条件涉及整个字符串,而不是 只是第一个角色。只是测试第一个角色 不可能满足;你必须检查一下每一个角色 串。 (问题的实际规范也不是这样 明确;除了第一个之外的所有字母是什么意思,如果有的话 只有一个字母?)

第三,无论结果如何,都可以循环转换 您的if。这肯定是错的。

第四,你不要交换案件;你只会将值小于 97。

这里有两个不同的问题。首先是确定 是否已设置大写锁定键。最简单的方法是 类似的东西:

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时才执行),或者将循环因子排除 分成一个单独的功能;在这两种情况下,第一个字符 将需要特殊处理,因为如果是小写,你 必须将其转换为上层。 ( IF 你有一个先决条件 您将看到的唯一字符是ASCII字母,然后就可以了 由ch ^= 0x20在上下之间切换。我推荐 反对它,因为它依赖于编码, 事实上,只有信件存在,而没有其他 字符)。

答案 1 :(得分:1)

关于“我应该如何改变我的解决方案,以便在网上判断中正确运作?”

问题表明:只有在与第一个字符分开时才更改单词 错误报告指出:cAPSlOCK应返回cAPSlOCK,而不是Capslock 因此,如果不应该更改输入,至少应该在程序中检查输出输入。

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