dengxinyi vor 6 Jahren
Ursprung
Commit
2dc280b936

+ 46 - 0
written-exam/kickstart-round-C/no1/main.cc

@@ -0,0 +1,46 @@
+#include <cstdio>
+#include <set>
+
+using std::set; using std::pair; using std::make_pair;
+
+const int N = 50000;
+const int R = 50000;
+const int C = 50000;
+
+char ins[N + 1];
+
+set<pair<int, int> > vis;
+
+int main() {
+  int T = 0, n, r, c, sr, sc;
+  scanf("%d", &T);
+  for (int t = 1; t <= T; t++) {
+    scanf("%d %d %d %d %d %s", &n, &r, &c, &sr, &sc, ins);
+    vis.clear();
+    vis.emplace(sr, sc);
+    for (int i = 0; i < n; i++) {
+      int dr = 0, dc = 0;
+      switch (ins[i]) {
+      case 'N':
+        dr = -1;
+        break;
+      case 'S':
+        dr = 1;
+        break;
+      case 'W':
+        dc = -1;
+        break;
+      case 'E':
+        dc = 1;
+        break;
+      }
+      do {
+        sr += dr;
+        sc += dc;
+      } while (vis.find(make_pair(sr, sc)) != vis.end());
+      vis.emplace(sr, sc);
+    }
+    printf("Case #%d: %d %d\n", t, sr, sc);
+  }
+  return 0;
+}

+ 20 - 0
written-exam/kickstart-round-C/no2/main.cc

@@ -0,0 +1,20 @@
+#include <cstdio>
+
+const int R = 300;
+const int C = 300;
+
+int grid[R][C];
+
+int main() {
+  int T = 0, r, c, k;
+  scanf("%d", &T);
+  for (int t = 1; t <= T; t++) {
+    scanf("%d %d %d", &r, &c, &k);
+    for (int i = 0; i < r; i++)
+      for (int j = 0; j < c; j++)
+        scanf("%d", &grid[i][j]);
+    
+    printf("Case #%d: %d\n", t, r * c);
+  }
+  return 0;
+}

+ 74 - 0
written-exam/kickstart-round-C/no3/main.cc

@@ -0,0 +1,74 @@
+#include <algorithm>
+#include <cstdio>
+#include <queue>
+#include <set>
+
+using std::sort; using std::priority_queue; using std::set;
+
+const int N = 1000;
+const int A = 1000;
+
+struct Dog {
+  int p;
+  int a;
+  int n;
+  Dog(int p = 0, int a = 0, int n = 1) : p(p), a(a), n(n) {}
+  bool operator<(const Dog &that) const {
+    if (this->p == that.p) return this->a < that.a;
+    return this->p < that.p;
+  }
+} dogs[N];
+
+struct Node {
+  int t;
+  int i;
+  int a;
+  int k;
+  Node(int t, int i, int a, int k) : t(t), i(i), a(a), k(k) {}
+  bool operator<(const Node &that) const {
+    return that.t < this->t;
+  }
+};
+
+int main() {
+  int T = 0, n, k;
+  scanf("%d", &T);
+  for (int t = 1; t <= T; t++) {
+    scanf("%d %d", &n, &k);
+    for (int i = 0; i < n; i++)
+      scanf("%d", &dogs[i].p);
+    set<int> colors;
+    for (int i = 0; i < n; i++) {
+      scanf("%d", &dogs[i].a);
+      colors.insert(dogs[i].a);
+    }
+    sort(dogs, dogs + n);
+    int d = 0, aa = dogs[0].a, pp = dogs[0].p;
+    for (int i = 1; i < n; i++) {
+      if (dogs[i].a == aa && dogs[i].p == pp) {
+        dogs[d].n++;
+      } else {
+        dogs[++d] = dogs[i];
+        aa = dogs[d].a;
+        pp = dogs[d].p;
+      }
+    }
+    n = d + 1;
+    priority_queue<Node> pq;
+    pq.emplace(0, -1, *colors.begin(), 0);
+    Node tp(0, -1, 0, 0);
+    while (!pq.empty()) {
+      tp = pq.top();
+      pq.pop();
+      if (k <= tp.k) break;
+      int pos = tp.i == -1 ? 0 : dogs[tp.i].p;
+      set<int>::iterator it = ++colors.find(tp.a);
+      if (it != colors.end()) pq.emplace(tp.t + pos, -1, *it, tp.k);
+      int nxt = tp.i + 1;
+      for (; nxt < n && dogs[nxt].a != tp.a; nxt++) {}
+      if (nxt < n) pq.emplace(tp.t + dogs[nxt].p - pos, nxt, tp.a, tp.k + dogs[nxt].n);
+    }
+    printf("Case #%d: %d\n", t, tp.t);
+  }
+  return 0;
+}