Submission #27971957


Source Code Expand

import std.algorithm, std.array, std.container, std.conv, std.math, std.numeric, std.random, std.range, std.stdio, std.string, std.typecons, core.bitop;

struct Point { int x, y; };

struct Route { int id; Point from, to; };

int mhdistance(Point a, Point b)
{
  return abs(a.x - b.x) + abs(a.y - b.y);
}

double distance(Point a, Point b)
{
  return mhdistance(a, b);
}

double route_score(Point base, Route r)
{
  double d1 = distance(base, r.from), d2 = distance(base, r.to);
  return d1 * d1 + d2 * d2;
}

long solve(Route[] pending_routes, ref int[] done_routes, ref int[] ans)
{
  int m = 50;
  Point[] pending_dest;
  Point lastpos = Point(400, 400);

  ans ~= 400;
  ans ~= 400;

  long score = 0;

  while (done_routes.length < m || pending_dest.length > 0) {
    bool do_route = false;
    if (pending_dest.length == 0) {
      do_route = true;
    } else if (done_routes.length < m) {
      if (distance(pending_routes[0].from, lastpos) <= distance(pending_dest[0], lastpos)) {
        do_route = true;
      }
    }
    if (do_route) {
        score += mhdistance(lastpos, pending_routes[0].from);
        done_routes ~= pending_routes[0].id;
        lastpos = Point(pending_routes[0].from.x, pending_routes[0].from.y);
        ans ~= pending_routes[0].from.x;
        ans ~= pending_routes[0].from.y;
        pending_dest ~= Point(pending_routes[0].to.x, pending_routes[0].to.y);
        pending_routes = pending_routes[1 .. $];
        pending_routes.sort!((a, b) => distance(lastpos, a.from) < distance(lastpos, b.from));
        pending_dest.sort!((a, b) => distance(lastpos, a) < distance(lastpos, b));
    } else {
        score += mhdistance(lastpos, pending_dest[0]);
        lastpos = Point(pending_dest[0].x, pending_dest[0].y);
        ans ~= pending_dest[0].x;
        ans ~= pending_dest[0].y;
        pending_dest = pending_dest[1 .. $];
        pending_dest.sort!((a, b) => distance(lastpos, a) < distance(lastpos, b));
    }
  }

  ans ~= 400;
  ans ~= 400;
  score += mhdistance(lastpos, Point(400, 400));
  return score;
}

void main()
{
  Route[] routes;
  foreach (i ; 0 .. 1000) {
    int x1, y1, x2, y2;
    readf!" %d %d %d %d "(x1, y1, x2, y2);
    routes ~= Route(i + 1, Point(x1, y1), Point(x2, y2));
  }
  auto base = Point(400, 400);
  routes.sort!((a, b) => route_score(base, a) < route_score(base, b));

  int[] final_ans, final_done_routes;
  long best_score = long.max;
  int m = 50;

  foreach (i ; 0 .. 400) {
    int[] ans, done_routes;
    Route[] pending_routes = routes[0 .. m + i].dup;
    long score = solve(pending_routes, done_routes, ans);
    if (score < best_score) {
      final_ans = ans.dup;
      final_done_routes = done_routes.dup;
      best_score = score;
    }
  }

  writefln("%d %s", m, final_done_routes.map!text.join(" "));
  writefln("%d %s", final_ans.length / 2, final_ans.map!text.join(" "));
}

Submission Info

Submission Time
Task A - Food Delivery
User ssvb
Language D (LDC 1.20.1)
Score 1459242
Code Size 2966 Byte
Status AC
Exec Time 266 ms
Memory 5388 KiB

Judge Result

Set Name test_ALL
Score / Max Score 1459242 / 10000000
Status
AC × 100
Set Name Test Cases
test_ALL test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt
Case Name Status Exec Time Memory
test_0000.txt AC 228 ms 5144 KiB
test_0001.txt AC 216 ms 5236 KiB
test_0002.txt AC 241 ms 5324 KiB
test_0003.txt AC 238 ms 5124 KiB
test_0004.txt AC 234 ms 5348 KiB
test_0005.txt AC 239 ms 5260 KiB
test_0006.txt AC 216 ms 5200 KiB
test_0007.txt AC 245 ms 5340 KiB
test_0008.txt AC 227 ms 5252 KiB
test_0009.txt AC 242 ms 5220 KiB
test_0010.txt AC 231 ms 5252 KiB
test_0011.txt AC 231 ms 5332 KiB
test_0012.txt AC 223 ms 5160 KiB
test_0013.txt AC 226 ms 5220 KiB
test_0014.txt AC 229 ms 5324 KiB
test_0015.txt AC 245 ms 5120 KiB
test_0016.txt AC 249 ms 5312 KiB
test_0017.txt AC 252 ms 5180 KiB
test_0018.txt AC 218 ms 5288 KiB
test_0019.txt AC 232 ms 5316 KiB
test_0020.txt AC 247 ms 5148 KiB
test_0021.txt AC 248 ms 5164 KiB
test_0022.txt AC 235 ms 5140 KiB
test_0023.txt AC 219 ms 5324 KiB
test_0024.txt AC 231 ms 5356 KiB
test_0025.txt AC 239 ms 5336 KiB
test_0026.txt AC 260 ms 5236 KiB
test_0027.txt AC 239 ms 5100 KiB
test_0028.txt AC 250 ms 5136 KiB
test_0029.txt AC 237 ms 5096 KiB
test_0030.txt AC 228 ms 5248 KiB
test_0031.txt AC 239 ms 5256 KiB
test_0032.txt AC 239 ms 5248 KiB
test_0033.txt AC 244 ms 5384 KiB
test_0034.txt AC 240 ms 5208 KiB
test_0035.txt AC 226 ms 5204 KiB
test_0036.txt AC 220 ms 5204 KiB
test_0037.txt AC 217 ms 5176 KiB
test_0038.txt AC 227 ms 5240 KiB
test_0039.txt AC 234 ms 5216 KiB
test_0040.txt AC 233 ms 5328 KiB
test_0041.txt AC 220 ms 5316 KiB
test_0042.txt AC 233 ms 5204 KiB
test_0043.txt AC 235 ms 5304 KiB
test_0044.txt AC 232 ms 5232 KiB
test_0045.txt AC 246 ms 5116 KiB
test_0046.txt AC 261 ms 5244 KiB
test_0047.txt AC 255 ms 5300 KiB
test_0048.txt AC 254 ms 5208 KiB
test_0049.txt AC 234 ms 5388 KiB
test_0050.txt AC 255 ms 5124 KiB
test_0051.txt AC 238 ms 5208 KiB
test_0052.txt AC 230 ms 5344 KiB
test_0053.txt AC 250 ms 5232 KiB
test_0054.txt AC 226 ms 5192 KiB
test_0055.txt AC 245 ms 5236 KiB
test_0056.txt AC 230 ms 5108 KiB
test_0057.txt AC 236 ms 5208 KiB
test_0058.txt AC 215 ms 5228 KiB
test_0059.txt AC 244 ms 5368 KiB
test_0060.txt AC 250 ms 5248 KiB
test_0061.txt AC 242 ms 5216 KiB
test_0062.txt AC 226 ms 5096 KiB
test_0063.txt AC 242 ms 5296 KiB
test_0064.txt AC 240 ms 5244 KiB
test_0065.txt AC 228 ms 5228 KiB
test_0066.txt AC 234 ms 5208 KiB
test_0067.txt AC 217 ms 5232 KiB
test_0068.txt AC 238 ms 5288 KiB
test_0069.txt AC 250 ms 5288 KiB
test_0070.txt AC 257 ms 5212 KiB
test_0071.txt AC 224 ms 5156 KiB
test_0072.txt AC 262 ms 5140 KiB
test_0073.txt AC 240 ms 5124 KiB
test_0074.txt AC 253 ms 5232 KiB
test_0075.txt AC 235 ms 5188 KiB
test_0076.txt AC 266 ms 5200 KiB
test_0077.txt AC 228 ms 5208 KiB
test_0078.txt AC 216 ms 5204 KiB
test_0079.txt AC 239 ms 5224 KiB
test_0080.txt AC 239 ms 5156 KiB
test_0081.txt AC 230 ms 5348 KiB
test_0082.txt AC 229 ms 5208 KiB
test_0083.txt AC 251 ms 5212 KiB
test_0084.txt AC 226 ms 5224 KiB
test_0085.txt AC 235 ms 5348 KiB
test_0086.txt AC 249 ms 5148 KiB
test_0087.txt AC 246 ms 5224 KiB
test_0088.txt AC 238 ms 5128 KiB
test_0089.txt AC 227 ms 5148 KiB
test_0090.txt AC 233 ms 5212 KiB
test_0091.txt AC 238 ms 5216 KiB
test_0092.txt AC 256 ms 5384 KiB
test_0093.txt AC 237 ms 5148 KiB
test_0094.txt AC 231 ms 5360 KiB
test_0095.txt AC 227 ms 5236 KiB
test_0096.txt AC 213 ms 5212 KiB
test_0097.txt AC 233 ms 5212 KiB
test_0098.txt AC 244 ms 5196 KiB
test_0099.txt AC 244 ms 5212 KiB