测试用例的意外输出

时间:2013-12-06 15:04:06

标签: c++ implementation greedy

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

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

测试:#5,时间:30 ms。,内存:380 KB,退出代码: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 个答案:

答案 0 :(得分:1)

如果您的输入为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。< / p>

我认为您想要检查g-h>0而不是g!=-1,但是有很多地方可以简化您的代码。请注意,使用调试器并逐步执行此操作可以向您显示问题的速度更快,并且比提出问题更有助于提高您的技能。

对于其他任何看过这个问题的人来说,this是解决这个问题的一个相当简单的答案。

答案 1 :(得分:1)

  1. 亲自动手,看看你是否得到了同样的答案。如果您手动获得与计算相同的答案,则算法错误。如果不这样做,那么您的代码就错了。
  2. 从中间计算中打印变量,看看它们是否符合您的想法。
  3. 确保在每次使用之前重新初始化变量(包括数组)。
  4. 其他提示:

    • 使用switch语句而不是多个if-equal语句。
    • 为变量命名。它可以帮助您在查看代码时跟踪。
    • 当您有多个具有相似用途的变量时,请考虑使用数组。 bcde看似相似。