#include #include #include #include #include #include #include #include #include #include /*#include #include */ using namespace std; FILE* in; FILE* out; //const int BITS=64 000 000; const clock_t TIME_LIMIT = (clock_t) (4.7* CLOCKS_PER_SEC); const clock_t HARD_LIMIT = (clock_t) (4.95* CLOCKS_PER_SEC); clock_t BEGIN_TIME; int N,M,B; vectorFindResult(vector a1,vector a2) { vectorresult; for(int j=0;ja) { int result=0; for(int j=0;jans; int mxRes=0; vector >results; vector >arr; vector< vector >FindComb(unsigned short int n,unsigned short int k) { vector< vector > nil; if(results.size()>memory)return nil; if(clock()-BEGIN_TIME>TIME_LIMIT)return nil; if(k==1) { vector< vector > nil; results.clear(); for(unsigned short int i=0;itoInsert(1,i); //toInsert.push_back(i); int currRes=CalcResult(arr[i]); if(mxRes >prev=FindComb(n,k-1); vector< vector >curr; vector >newresults; for(int i=prev.size()-1;i>=0;i--) { if(mxRes==M*(B-1)*(B-1))break; int last=prev[i].back(); vectorpopped_r; popped_r=results[i]; vectorpopped_p; popped_p=prev[i]; for (int j=last+1;j cresult=FindResult(popped_r,arr[j]); vectortoInsert; toInsert=popped_p; toInsert.push_back(j); int currRes=CalcResult(cresult); if(currRes>mxRes) { mxRes=currRes; ans=toInsert; } if(mxRes==M*(B-1)*(B-1))break; curr.push_back(toInsert); newresults.push_back(cresult); if(newresults.size()>memory)break; if(clock()-BEGIN_TIME>TIME_LIMIT)break; } if(newresults.size()>memory)break; if(clock()-BEGIN_TIME>TIME_LIMIT)break; } results=newresults; return curr; } vector< vector >FindComb1(unsigned short int n,unsigned short int k) { if(k==1) { vector< vector > nil; results.clear(); for(int i=0;itoInsert; toInsert.push_back(i); int currRes=CalcResult(arr[i]); if(mxRes > nil; if(results.size()>memory)return nil; if(clock()-BEGIN_TIME>TIME_LIMIT)return nil; vector< vector >prev=FindComb(n,k-1); vector< vector >curr; for(int i=prev.size()-1;i>=0;i--) { if(mxRes==M*(B-1)*(B-1))break; int last=prev[i].back(); vectorpopped_r; if(N>200) { popped_r=results.back(); results.pop_back(); } else popped_r=results[i]; vectorpopped_p; if(N>200) { popped_p=prev.back(); prev.pop_back(); } else popped_p=prev[i]; for (int j=last+1;j cresult=FindResult(popped_r,arr[j]); vectortoInsert; toInsert=popped_p; toInsert.push_back(j); int currRes=CalcResult(cresult); if(currRes>mxRes) { mxRes=currRes; ans=toInsert; } if(mxRes==M*(B-1)*(B-1))break; curr.push_back(toInsert); if(clock()-BEGIN_TIME>TIME_LIMIT)break; } if(clock()-BEGIN_TIME>TIME_LIMIT)break; } return curr; } int main(){ in = stdin; out = stdout; in = fopen("subsetselection.in", "rt"); out = fopen("subsetselection.out", "wt"); BEGIN_TIME = clock(); fscanf(in, "%d%d%d", &N,&M,&B); //memory=BITS-N*M; for(int i=0;icurr; for(int j=0;j > combinations; if(N<201) { memory=290000; combinations=FindComb(N,N); } //else if(N<201)FindComb(N,3); else { memory=62000; FindComb1(N,2); } fprintf(out, "%d\n", ans.size()); for(int i=0;i