#include #include #include #include #include #include #include #include #include #include using namespace std; #define VIT(i, v) for (i = 0; i < v.size(); i++) #define IT(it, ds) for (it = ds.begin(); it != ds.end(); it++) #define O1(v) cout << v << endl #define O2(v1, v2) cout << v1 << " " << v2 << endl #define O3(v1, v2, v3) cout << v1 << " " << v2 << " " << v3 << endl #define OVEC(v) { int iii; VIT(iii, v) cout << v[iii] << " " ; cout << endl; } typedef vector IVec; class CtuRobots { public: double maxDist(int B, vector cost, vector cap); vector CP; vector CO; double MF(int index, int budget); vector < vector < double > > cache; }; double CtuRobots::MF(int index, int budget) { double dnot, dinc; if (index == CO.size()) return 0; if (cache[index][budget] != -1) return cache[index][budget]; dnot = MF(index+1, budget); if (budget < CO[index]) { cache[index][budget] = dnot; return cache[index][budget]; } dinc = (MF(index+1, budget - CO[index]) + CP[index]) / 3; cache[index][budget] = (dinc > dnot) ? dinc : dnot; return cache[index][budget]; } double CtuRobots::maxDist(int B, vector cost, vector cap) { int i; multimap M; multimap ::iterator mit; double dist, best; VIT(i, cost) M.insert(make_pair(-cap[i], cost[i])); IT(mit, M) { CO.push_back(mit->second); CP.push_back(-mit->first); } cache.resize(cost.size()+1); VIT(i, cache) cache[i].resize(B+1, -1); best = 0; VIT(i, CP) { if (CO[i] <= B) { dist = (CP[i] + MF(i+1, B-CO[i]) ) / 2.0; if (dist > best) best = dist; } } return best; }