CodeChef(February Cook-Off)の最後のコンテストで、私はこの問題のアルゴリズムを約15分で解決できると思っていましたが、正解を得ることができませんでした。私は永遠に試しました、私は複数のものをチェックしました、私は間違いがどこにあるのか分かりません。私の一般的なアルゴリズムは問題の編集にマッチしますが、どこかで私が推測できないバグがあります。問題へCodeChef Daily Train Wrong Answer
リンク - 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;
}
答えが見つかりましたが、理由はわかりません。私は問題が私のchoose関数になければならないと判断したので、0を返さないことを知ったときにのみ呼び出すようにしました(つまり、n> = k)。それはうまくいった。しかし、なぜ私は理解していない。 n
kchinger