请注意测试样例第一行“3”后的空格!

P4414 [COCI2006-2007#2] ABC

EstablishedYet @ 2024-09-29 18:04:37

这道题一定要注意测试样例的第一行是“1 5 3 ”,也就是说3的最后是有空格的! 我原本的代码是:

#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    char no;
    no=cin.get();//本来没发现“3”后面有空格,所以只用一次cin.get()消耗掉回车
    int min1,max1;
    min1=min({a,b,c});
    max1=max({a,b,c});
    int re=a+b+c-min1-max1;
    int A,B,C;
    char get;
    for(int i=0;i<3;i++)
    {
        get=cin.get();
        if(get=='A')
            A=min1;
        else if(get=='B')
            A=re;
        else
            A=max1;
        if(i<=1)
            cout<<A<<" ";
        else
            cout<<A;
    }
    return 0;
}

但这样会全部WA,因为第一行的“3”和第二行的“A”中间其实有两个字符:一个空格一个回车。而上述代码只消耗掉一个字符。而且注意运行上述代码时,如果用复制样例并粘贴的方式输入会得到正确答案,因为粘贴过程中没有输入回车键,此时“3”和“A”间只有一个字符;但如果用手敲的方式输入,也就是先输“1 5 3 ”,再输回车键,再输“ABC”的话,此时“3”和“A”间有两个字符,会得到错误答案。 而显然本题在判定的时候采取的输入方式是类似于手敲的的,因而需要将程序改为:

#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    char no,no1;
    no=cin.get();
    no1=cin.get();//用两次cin.get()分别消耗掉空格和回车
    int min1,max1;
    min1=min({a,b,c});
    max1=max({a,b,c});
    int re=a+b+c-min1-max1;
    int A,B,C;
    char get;
    for(int i=0;i<3;i++)
    {
        get=cin.get();
        if(get=='A')
            A=min1;
        else if(get=='B')
            A=re;
        else
            A=max1;
        if(i<=1)
            cout<<A<<" ";
        else
            cout<<A;
    }
    return 0;
}

此时再上传会AC。 这个代码或许不是最优解,但或许能解决一些觉得自己是对的却完全WA的朋友的困惑。


by majinhong @ 2024-10-05 17:40:54

找了一下午错,帮大忙了QAQ


by d18669991101 @ 2024-11-16 17:45:21

或者可以用C++的

cout<<A<<" "

后面省略


|