CodeChef每日培训错误答案

CodeChef Daily Train Wrong Answer

本文关键字:答案 错误 培训 每日 CodeChef      更新时间:2023-10-16

所以,在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 msecn",(double)(clock()-tStart));
#endif
    return 0;
}

因此正确的代码如下。

在while循环中,当我输出+=时,我会做一个小的更改。

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

问题是我的select函数没有正确处理(至少)一个案例。如果compartment[i]=0,tickets=1,答案应该是0,因为从1个东西中选择0个东西的方法是0。但是,0和1的阶乘都是1,-1(0-1)的阶乘(在我的函数中)也是1,所以我的选择返回1/(1*1)。哎呀。不知道为什么我花了这么长时间才找到这个。我从来没有测试过那个病例。很抱歉浪费了时间,我还在学习。