测试用例的意外输出

Unexpected output for test case

本文关键字:输出 意外 测试用例      更新时间:2023-10-16

Codeforces问题158B-http://codeforces.com/problemset/problem/158/B

我得到了测试用例5的意外输出。我认为我应该得到1作为输出,但我是2。请指导我。法官日志:

测试:#5,时间:30ms,内存:380KB,退出代码:0,检查器退出代码:1,判决:WRONG_ANSWER输入2.2 1输出2.答复1.检查器日志应为错误答案1,找到2

我的解决方案:

#include<iostream>
using namespace std;
int n,a[100000],i,b,c,d,e,f,g,h;
int main()
{
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    b=0;
    c=0;
    d=0;
    e=0;
    for(i=0;i<n;i++)
    {
        if(a[i]==1) //To check for number of 1,2,3 and 4 membered groups.
        b=b+1;
        if(a[i]==2)
        c=c+1;
        if(a[i]==3)
        d=d+1;
        if(a[i]==4)
        e=e+1;  
    }
    f=e;
    if(d>b) //More 3 member groups than 1.
    {
        f=f+d; //f=f+b+(g-b) 3 and 1 member groups combine.Remaining 3 i.e. (g-b) member groups will can't combine with 2 member groups.Hence,they take separate taxies.
        g=-1;
    }
    if(b>=d) //More 1 member groups than 3.
    {
        f=f+d;
        g=b-d; //g=remaining 1 member groups.
    }
    h=(2*c)%4; //Empty seats in last taxi.Possible values can be 0,1,2,3.
    if(h==0)
    f=f+(c/2);
    else
    f=f+((c+1)/2);
    if(g!=-1)
    {
        g=g-h; //Remaining 1 member groups after combining with remaining seats in last 2 member taxi.
        if((g%4)==0)
        f=f+(g/4);
        else
        f=f+(g/4)+1;
    }
    cout<<f;
}

如果您的输入是2 2 1,则bc都将为1,使第一组条件句中的f为0,g为1。h将是(2 * 1) % 4或2,从而对f(0+1=1)进行更新。由于g是1,g-h是-1,这将导致您执行f=f+(g/4)+1,即整数数学中的f=1 + (-1/4)+1,即1+0+1=2。

我想您想检查是否是g-h>0而不是g!=-1,但有很多地方可以简化代码。请注意,使用调试器并逐步完成这项工作会向您显示问题的速度要快得多,并且比询问SO更有助于提高您的技能

对于其他关注这个问题的人来说,这是一个相当简单的问题答案。

  1. 用手做,看看你是否得到同样的答案。如果你手工得到的答案与计算结果相同,那么你的算法就是错误的。如果你不这样做,你的代码就是错误的
  2. 打印中间计算中的变量,看看它们是否是您认为应该的
  3. 如果重要的话,请确保在每次使用之前重新初始化变量(包括数组)

其他提示:

  • 请使用switch语句,而不要使用多个if equal语句
  • 命名变量。它可以帮助您在查看代码时保持跟踪
  • 如果有多个用途相似的变量,请考虑使用数组。bcde看起来都很相似