ADDED SRM/594-U/1A.cpp Index: SRM/594-U/1A.cpp ================================================================== --- SRM/594-U/1A.cpp +++ SRM/594-U/1A.cpp @@ -0,0 +1,131 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef complex CMP; + +class AstronomicalRecords { public: + int minimalPlanets(vector A, vector B) + { + int best = A.size() + B.size(); + for(int i=0; i AA, BB; + for(int x=0; x AA, BB; + for(int x=i+1; x A, vector B) + { + vector< vector > dp(A.size()+1, vector(B.size()+1)); + + for(int i=0; i +double start_time; string timer() + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } +template ostream& operator<<(ostream& os, const vector& v) + { os << "{ "; + for(typename vector::const_iterator it=v.begin(); it!=v.end(); ++it) + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } +void verify_case(const int& Expected, const int& Received) { + bool ok = (Expected == Received); + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); +#define END verify_case(_, AstronomicalRecords().minimalPlanets(A, B));} +int main(){ + +CASE(0) + int A_[] = {1,2,1,2,1}; + vector A(A_, A_+sizeof(A_)/sizeof(*A_)); + int B_[] = {2,1,2,1,2}; + vector B(B_, B_+sizeof(B_)/sizeof(*B_)); + int _ = 6; +END +CASE(1) + int A_[] = {1,2,3,4}; + vector A(A_, A_+sizeof(A_)/sizeof(*A_)); + int B_[] = {2,4,6,8}; + vector B(B_, B_+sizeof(B_)/sizeof(*B_)); + int _ = 4; +END +CASE(2) + int A_[] = {2,3,2,3,2,3,2}; + vector A(A_, A_+sizeof(A_)/sizeof(*A_)); + int B_[] = {600,700,600,700,600,700,600}; + vector B(B_, B_+sizeof(B_)/sizeof(*B_)); + int _ = 10; +END +CASE(3) + int A_[] = {1,2,3,4,5,6,7,8,9}; + vector A(A_, A_+sizeof(A_)/sizeof(*A_)); + int B_[] = {6,7,8,9,10,11,12}; + vector B(B_, B_+sizeof(B_)/sizeof(*B_)); + int _ = 12; +END +CASE(4) + int A_[] = {100000000,200000000}; + vector A(A_, A_+sizeof(A_)/sizeof(*A_)); + int B_[] = {200000000,100000000}; + vector B(B_, B_+sizeof(B_)/sizeof(*B_)); + int _ = 3; +END +CASE(5) + int A_[] = {7,14,7,14,7,1}; + vector A(A_, A_+sizeof(A_)/sizeof(*A_)); + int B_[] = {10,5,10,5,10,1}; + vector B(B_, B_+sizeof(B_)/sizeof(*B_)); + int _ = 8; +END +/* +CASE(6) + int A_[] = ; + vector A(A_, A_+sizeof(A_)/sizeof(*A_)); + int B_[] = ; + vector B(B_, B_+sizeof(B_)/sizeof(*B_)); + int _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/594-U/1B.cpp Index: SRM/594-U/1B.cpp ================================================================== --- SRM/594-U/1B.cpp +++ SRM/594-U/1B.cpp @@ -0,0 +1,171 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef complex CMP; + +typedef int vert; +typedef vert edge; +typedef vector edges; +typedef vector graph; + +bool augment( graph& G, int v, vector& matchTo, bool visited[] ) +{ + for(int i=0; i +int biMatch( graph& G, int L ) // [0,L):left, [L,?):right + // only left->right edges are used during computation +{ + vector matchTo(G.size(), -1); + int ans = 0; + for(vert v=0; v board) + { + const int N = board.size(); + + vector< vector > ID(N, vector(N)); + int Nblank=0, Nwhite=0; + for(int y=0; y(G, Nblank); + } +}; + +// BEGIN CUT HERE +#include +double start_time; string timer() + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } +template ostream& operator<<(ostream& os, const vector& v) + { os << "{ "; + for(typename vector::const_iterator it=v.begin(); it!=v.end(); ++it) + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } +void verify_case(const int& Expected, const int& Received) { + bool ok = (Expected == Received); + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); +#define END verify_case(_, FoxAndGo3().maxEmptyCells(board));} +int main(){ + +CASE(0) + string board_[] = {"o.o", + ".o.", + "o.o"}; + vector board(board_, board_+sizeof(board_)/sizeof(*board_)); + int _ = 5; +END +CASE(1) + string board_[] = {"...", + ".o.", + "..."} +; + vector board(board_, board_+sizeof(board_)/sizeof(*board_)); + int _ = 8; +END +CASE(2) + string board_[] = {"xxxxx", + "xxoxx", + "xo.ox", + "xxoxx", + "xxxxx"} +; + vector board(board_, board_+sizeof(board_)/sizeof(*board_)); + int _ = 4; +END +CASE(3) + string board_[] = {".xox.", + ".o.ox", + "x.o.o", + "ox.ox", + ".ox.."} + ; + vector board(board_, board_+sizeof(board_)/sizeof(*board_)); + int _ = 12; +END +CASE(4) + string board_[] = {"o.o.o", + ".ox..", + "oxxxo", + "..x..", + "o.o.o"} +; + vector board(board_, board_+sizeof(board_)/sizeof(*board_)); + int _ = 12; +END +CASE(5) + string board_[] = {"...", + "...", + "..."}; + vector board(board_, board_+sizeof(board_)/sizeof(*board_)); + int _ = 9; +END +/* +CASE(6) + string board_[] = ; + vector board(board_, board_+sizeof(board_)/sizeof(*board_)); + int _ = ; +END +CASE(7) + string board_[] = ; + vector board(board_, board_+sizeof(board_)/sizeof(*board_)); + int _ = ; +END +*/ +} +// END CUT HERE