ADDED SRM/583-U/1A.cpp Index: SRM/583-U/1A.cpp ================================================================== --- SRM/583-U/1A.cpp +++ SRM/583-U/1A.cpp @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef long double LD; +typedef complex CMP; + +class TravelOnMars { public: + int minTimes(vector range, int startCity, int endCity) + { + int N = range.size(); + + set V; + V.insert(startCity); + for(int s=0 ;; ++s) + { + if(V.count(endCity)) + return s; + set VV; + for(set::iterator it=V.begin(); it!=V.end(); ++it) + { + int v = *it; + for(int d=0; d<=range[v]; ++d) { + VV.insert((v+d)%N); + VV.insert((v-d+N*100)%N); + } + } + V.swap(VV); + } + } +}; + +// 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(_, TravelOnMars().minTimes(range, startCity, endCity));} +int main(){ + +CASE(0) + int range_[] = {2,1,1,1,1,1}; + vector range(range_, range_+sizeof(range_)/sizeof(*range_)); + int startCity = 1; + int endCity = 4; + int _ = 2; +END +CASE(1) + int range_[] = {2,1,1,1,1,1}; + vector range(range_, range_+sizeof(range_)/sizeof(*range_)); + int startCity = 4; + int endCity = 1; + int _ = 3; +END +CASE(2) + int range_[] = {2,1,1,2,1,2,1,1}; + vector range(range_, range_+sizeof(range_)/sizeof(*range_)); + int startCity = 2; + int endCity = 6; + int _ = 3; +END +CASE(3) + int range_[] = {3,2,1,1,3,1,2,2,1,1,2,2,2,2,3}; + vector range(range_, range_+sizeof(range_)/sizeof(*range_)); + int startCity = 6; + int endCity = 13; + int _ = 4; +END +CASE(4) +int range_[] = {10,1,1,1,4,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}; + vector range(range_, range_+sizeof(range_)/sizeof(*range_)); + int startCity = 3; + int endCity = 10; + int _ = 3; +END +CASE(5) +int range_[] = {50,50}; + vector range(range_, range_+sizeof(range_)/sizeof(*range_)); + int startCity = 0; + int endCity = 1; + int _ = 1; +END +} +// END CUT HERE ADDED SRM/583-U/1B.cpp Index: SRM/583-U/1B.cpp ================================================================== --- SRM/583-U/1B.cpp +++ SRM/583-U/1B.cpp @@ -0,0 +1,173 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef long double LD; +typedef complex CMP; + +class TurnOnLamps { public: + typedef int Vert; + struct Edge { + bool init; + bool goal; + Vert from; + Vert to; + }; + + int minimize(vector roads, string initState, string isImportant) + { + int N = roads.size() + 1; + vector< vector > G(N); + for(int i=0; i rr = rec(e, G); + return min(rr.first, rr.second); + } + + static const int INF = 999999; + + // not use, use + pair rec(Edge e, vector >& G) + { + vector< pair > p; + for(int i=0; i r = calc_on_node(p); + if(e.goal) + (e.init ? r.second : r.first) = INF; + return r; + } + + pair calc_on_node(vector >& c) + { + int nu = calc(c); + int u = (c.empty() ? 1 : INF); + for(int i=0; i > cc = c; + cc.erase(cc.begin() + i); + int s1 = calc(cc); + int s2 = min(c[i].first + 1, c[i].second); + u = min(u, s1+s2); + } + return make_pair(nu, u); + } + + int calc(vector >& c) + { + int od = INF; + int ev = 0; + 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(_, TurnOnLamps().minimize(roads, initState, isImportant));} +int main(){ + +CASE(0) + int roads_[] = {0,0,1,1}; + vector roads(roads_, roads_+sizeof(roads_)/sizeof(*roads_)); + string initState = "0001"; + string isImportant = "0111"; + int _ = 1; +END +CASE(1) + int roads_[] = {0,0,1,1}; + vector roads(roads_, roads_+sizeof(roads_)/sizeof(*roads_)); + string initState = "0000"; + string isImportant = "0111"; + int _ = 2; +END +CASE(2) + int roads_[] = {0,0,1,1,4,4}; + vector roads(roads_, roads_+sizeof(roads_)/sizeof(*roads_)); + string initState = "000100"; + string isImportant = "111111"; + int _ = 2; +END +CASE(3) + int roads_[] = {0,0,1,1,4,4}; + vector roads(roads_, roads_+sizeof(roads_)/sizeof(*roads_)); + string initState = "100100"; + string isImportant = "011101"; + int _ = 2; +END +CASE(4) + int roads_[] = {0,0,2,2,3,1,6,3,1}; + vector roads(roads_, roads_+sizeof(roads_)/sizeof(*roads_)); + string initState = "010001110"; + string isImportant = "000110100"; + int _ = 1; +END +CASE(5) + int roads_[] = {0,0,1,2,4,4,6,1,2,5,2,8,8,3,6,4,14,7,18,14,11,7,1,12,7,5,18,23,0,14,11,10,2,2,6,1,30,11,9,12,5,35,25,11,23,17,14,45,15}; + vector roads(roads_, roads_+sizeof(roads_)/sizeof(*roads_)); + string initState = "0000000000010000000000000010000010100000000000000"; + string isImportant = "1010111111111011011111000110111111111111111110111"; + int _ = 14; +END +/* +CASE(6) + int roads_[] = ; + vector roads(roads_, roads_+sizeof(roads_)/sizeof(*roads_)); + string initState = ; + string isImportant = ; + int _ = ; +END +CASE(7) + int roads_[] = ; + vector roads(roads_, roads_+sizeof(roads_)/sizeof(*roads_)); + string initState = ; + string isImportant = ; + int _ = ; +END +*/ +} +// END CUT HERE