所以,在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;
}
答案 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)。哎呀。不知道为什么我这么久才找到这个。我从未测试过这种情况。对不起浪费时间,我还在学习。