Browse Source

Better greedy

Olivier Marty 8 years ago
parent
commit
75e3b03080
3 changed files with 26 additions and 7 deletions
  1. 3 3
      Olivier/instance.cpp
  2. 3 2
      Olivier/instance.h
  3. 20 2
      Olivier/main.cpp

+ 3 - 3
Olivier/instance.cpp

@@ -5,7 +5,7 @@ using namespace std;
 pos::pos(int x, int y) : x(x), y(y) {
 }
 
-int pos::dist2(pos &b) {
+int pos::dist2(const pos &b) const {
   return x*b.x + y*b.y;
 }
 
@@ -13,7 +13,7 @@ warehouse::warehouse(pos p, vector<int> disp) : p(p), disp(disp) {
 }
 
 
-order::order(pos p, map<int, int> ord) : p(p), ord(ord) {
+order::order(int id, pos p, map<int, int> ord) : id(id), p(p), ord(ord) {
 }
 
 
@@ -44,7 +44,7 @@ instance::instance() {
       cin >> tmp;
       ord[tmp]++;
     }
-    orders.push_back(order(pos(x, y), ord));
+    orders.push_back(order(i, pos(x, y), ord));
   }
 }
 

+ 3 - 2
Olivier/instance.h

@@ -7,7 +7,7 @@
 class pos {
   public:
     pos(int x, int y);
-    int dist2(pos &b);
+    int dist2(const pos &b) const;
     int x, y;
 };
 
@@ -20,8 +20,9 @@ class warehouse {
 
 class order {
   public:
-    order(pos p, std::map<int, int> ord);
+    order(int id, pos p, std::map<int, int> ord);
     pos p;
+    int id;
     std::map<int, int> ord;
 };
 

+ 20 - 2
Olivier/main.cpp

@@ -2,6 +2,22 @@
 
 using namespace std;
 
+instance ins;
+
+int dist2_wh(const order &a) {
+  int r = 1000000000;
+  for(int i = 0; i < ins.W; i++) {
+    r = min(r, a.p.dist2(ins.wh[i].p));
+  }
+  return r;
+}
+
+bool sort_ord(const order &a, const order &b) {
+  if(a.ord.size() == b.ord.size())
+    return dist2_wh(a) < dist2_wh(b);
+  return a.ord.size() < b.ord.size();
+}
+
 int next(instance &ins) {
   int best = -1;
   for(int i = 0; i < ins.orders.size(); i++) {
@@ -14,6 +30,8 @@ int next(instance &ins) {
 }
 
 void glouton(instance &ins) {
+  sort(ins.orders.begin(), ins.orders.end(), sort_ord);
+  cerr << ins.orders[0].ord.size() << endl;
   vector<int> drone_temps(ins.drones);
   vector<pos> drone_pos;
   int score = 0;
@@ -45,7 +63,7 @@ void glouton(instance &ins) {
 
     // pass order
     cout << drone << " L " << wa << " " << type.first << " " << quantity << endl;
-    cout << drone << " D " << next_i << " " << type.first << " " << quantity << endl;
+    cout << drone << " D " << ord.id << " " << type.first << " " << quantity << endl;
 
     // compute score
     score += ceil(10.*(ins.T-drone_temps[drone])/ins.T);
@@ -57,7 +75,7 @@ int main() {
   int seed = time(NULL);
   srand(seed);
   cerr << "seed : " << seed << endl;
-  instance ins;
+  //instance ins;
   glouton(ins);
   return 0;
 }