CodeChef每日火车错误的答案

时间:2012-02-22 18:34:02

标签: c++

所以,在CodeChef(二月Cook-Off)的最后一场比赛中,我在大约15分钟内得到了我认为是这个问题的工作算法,但无法得到正确的答案。我一直在尝试,我已经检查了多件事,我不明白我的错误在哪里。我的一般算法与问题的编辑相匹配,但我有一个我猜不到的错误。

问题的链接 - http://www.codechef.com/problems/daily

它是用C ++编写的。代码如下。基本上我只是阅读门票数量,汽车数量,通过汽车迭代。读取字符串,减少隔间数组,在隔间上进行组合(选择),添加到输出,完成。

在所有测试用例和我想出的一些测试用例上都能正常工作。那里有一些不需要的东西,只是我的CodeChef模板的一部分。

感谢任何帮助。

#include <iostream>
#include <time.h>
#include <string>
#include <math.h>
using namespace std;

const double PI=2*acos(0.0);
#define sqr(x) ((x)*(x))
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))



int factorial(int input){
    int output = 1;
    while(input>1){
        output*=input--;
    }
    return output;
}

int choose(int n, int k){
    int output = 0;
    output = factorial(n)/(factorial(k)*factorial(n-k));
    return output;
}

int main(){

#ifndef ONLINE_JUDGE
    clock_t tStart = clock();
    freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    //freopen("time.txt","w",stderr);
#endif

    int tickets;
    cin >> tickets;
    int cars;
    cin >> cars;
    string input;
    int output = 0;
    int compartments[9];
    while(cars-->0){
        for(int i = 0;i<9;i++){
            compartments[i] = 6;
        }
        cin >> input;
        for(int i = 0;i<=35;i++){
            compartments[i/4] -= (input.at(i)-48);
        }
        for(int i = 36;i<=53;i++){
            compartments[8-((i-36)/2)] -=(input.at(i)-48);
        }
        for(int i = 0;i<9;i++){
            output+=choose(compartments[i],tickets);
        }

    }

    cout << output;

#ifndef ONLINE_JUDGE
    fprintf(stderr,"Completed in %.0f msec\n",(double)(clock()-tStart));
#endif

    return 0;
}

1 个答案:

答案 0 :(得分:2)

所以正确的代码如下。

在while循环中,当我输出+ =时,我做了一个小改动。

if(compartments[i]>=tickets){
  output+=choose(compartments[i],tickets);
}

问题是我的选择功能没有正确处理(至少)一个案例。如果compartments [i] = 0且ticket = 1,则答案应为0,因为从1个事物中选择0个事物的方法是0.但是,0和1的阶乘都是1,并且阶乘(在我的函数中)是-1(0-1)也是1,所以我的选择返回1 /(1 * 1)。哎呀。不知道为什么我这么久才找到这个。我从未测试过这种情况。对不起浪费时间,我还在学习。