dengxinyi hace 6 años
padre
commit
8b66f8d215

+ 37 - 0
written-exam/kickstart-2019-B/no1/main.cc

@@ -0,0 +1,37 @@
+#include <cstdio>
+#include <cstring>
+
+using namespace std;
+
+const int N = 100000;
+const int Q = 100000;
+
+int sum[N + 1][26];
+
+char str[N + 1];
+
+int main() {
+  int T;
+  scanf("%d", &T);
+  for (int t = 1; t <= T; t++) {
+    int n, q;
+    scanf("%d %d", &n, &q);
+    scanf("%s", str);
+    memset(sum, 0, sizeof(sum));
+    for (int i = 0; i < n; i++) {
+      for (int j = 0; j < 26; j++) sum[i + 1][j] = sum[i][j];
+      int ch = str[i] - 'A';
+      sum[i + 1][ch]++;
+    }
+    int cnt = 0;
+    for (int i = 0, l, r; i < q; i++) {
+      scanf("%d %d", &l, &r);
+      int odd = 0;
+      for (int j = 0; j < 26; j++)
+        if (((sum[r][j] - sum[l - 1][j]) & 1) != 0) odd++;
+      if (odd <= 1) cnt++;
+    }
+    printf("Case #%d: %d\n", t, cnt);
+  }
+  return 0;
+}

+ 51 - 0
written-exam/kickstart-2019-B/no2/main.cc

@@ -0,0 +1,51 @@
+#include <algorithm>
+#include <cstdio>
+#include <cstring>
+
+using namespace std;
+
+const int N = 100;
+const int INF = 1 << 30;
+
+int n, si[N], ei[N], li[N];
+int energy;
+
+bool eaten[N];
+
+int energy_left(int sec, int e) {
+  int left = 0;
+  for (int i = 0; i < n; i++) {
+    if (eaten[i]) continue;
+    if (li[i] * sec < ei[i]) left += ei[i] - li[i] * sec;
+  }
+  return left;
+}
+
+void dfs(int i, int sec, int e) {
+  int left = energy_left(sec, e);
+  if (left + e < energy) return;
+  eaten[i] = true;
+  if (li[i] * sec < ei[i]) {
+    e += ei[i] - li[i] * sec;
+    energy = max(energy, e);
+  }
+  for (int j = 0; j < n; j++) {
+    if (eaten[j]) continue;
+    dfs(j, sec + si[i], e);
+  }
+  eaten[i] = false;
+}
+
+int main() {
+  int T;
+  scanf("%d", &T);
+  for (int t = 1; t <= T; t++) {
+    scanf("%d", &n);
+    for (int i = 0; i < n; i++) scanf("%d %d %d", &si[i], &ei[i], &li[i]);
+    memset(eaten, 0, sizeof(eaten));
+    energy = 0;
+    for (int i = 0; i < n; i++) dfs(i, 0, 0);
+    printf("Case #%d: %d\n", t, energy);
+  }
+  return 0;
+}

+ 52 - 0
written-exam/kickstart-2019-B/no2/main.cc.bak

@@ -0,0 +1,52 @@
+#include <algorithm>
+#include <cstdio>
+#include <cstring>
+
+using namespace std;
+
+const int N = 100;
+const int INF = 1 << 30;
+
+int n, si[N], ei[N], li[N];
+
+bool eaten[N];
+
+int main() {
+  int T;
+  scanf("%d", &T);
+  for (int t = 1; t <= T; t++) {
+    scanf("%d", &n);
+    for (int i = 0; i < n; i++) scanf("%d %d %d", &si[i], &ei[i], &li[i]);
+    memset(eaten, 0, sizeof(eaten));
+    int energy = 0;
+    for (int i = 0; i < n; i++) {
+      int lost = INF, idx = -1;
+      for (int j = 0; j < n; j++) {
+        int cur_lost = 0;
+        if (eaten[j]) continue;
+        for (int k = 0, s = si[j]; k < n; k++) {
+          if (k == j || eaten[k]) continue;
+          if (ei[k] <= s * li[k]) {
+            cur_lost += ei[k];
+          } else {
+            cur_lost += s * li[k];
+          }
+        }
+        if (cur_lost < lost || cur_lost == lost) {
+          lost = cur_lost;
+          idx = j;
+        }
+      }
+      if (idx == -1) break;
+      eaten[idx] = true;
+      energy += ei[idx];
+      for (int j = 0, s = si[idx]; j < n; j++) {
+        if (eaten[j]) continue;
+        if (ei[j] <= s * li[j]) eaten[j] = true;
+        ei[j] -= s * li[j];
+      }
+    }
+    printf("Case #%d: %d\n", t, energy);
+  }
+  return 0;
+}

+ 41 - 0
written-exam/kickstart-2019-B/no3/main.cc

@@ -0,0 +1,41 @@
+#include <algorithm>
+#include <cstdio>
+#include <map>
+
+using namespace std;
+
+const int N = 100000;
+
+int n, s, type[N];
+
+int main() {
+  int T;
+  scanf("%d", &T);
+  for (int t = 1; t <= T; t++) {
+    scanf("%d %d", &n, &s);
+    for (int i = 0; i < n; i++) scanf("%d", &type[i]);
+    int cnt = 0;
+    map<int, int> freq;
+    for (int i = 0; i < n; i++) {
+      freq.clear();
+      int cur_cnt = 0;
+      for (int j = i; j < n; j++) {
+        if (freq.find(type[i]) == freq.end()) {
+          freq[type[j]] = 1;
+          cur_cnt++;
+        } else {
+          int f = freq[type[j]];
+          if (f < s) {
+            cur_cnt++;
+          } else if (f == s) {
+            cur_cnt -= s;
+          }
+          freq[type[j]] = f + 1;
+        }
+        cnt = max(cnt, cur_cnt);
+      }
+    }
+    printf("Case #%d: %d\n", t, cnt);
+  }
+  return 0;
+}