#include <bits/stdc++.h>
using namespace std;
struct leg {
  int l, d;
  friend bool operator<(const leg &a, const leg &b) {
    if (a.l < b.l) return 1;
    if (a.l == b.l && a.d < b.d) return 1;
    return 0;
  }
} a[100001];
struct segtree {
  int l, r, sum, s;
} tree[100001 << 5];
int n, tot, sum[100001], root[100001], ans;
void maketree(int &x, int l, int r) {
  x = ++tot;
  if (l >= r) return;
  maketree(tree[x].l, l, ((l + r) >> 1));
  maketree(tree[x].r, ((l + r) >> 1) + 1, r);
}
void update(int &x, int y, int l, int r, int p) {
  x = ++tot;
  tree[x] = tree[y];
  tree[x].sum++;
  tree[x].s += p;
  if (l >= r) return;
  if (p <= ((l + r) >> 1))
    update(tree[x].l, tree[y].l, l, ((l + r) >> 1), p);
  else
    update(tree[x].r, tree[y].r, ((l + r) >> 1) + 1, r, p);
}
int queryks(int x, int l, int r, int k) {
  if (!k) return 0;
  if (l >= r) return k * l;
  if (k <= tree[tree[x].l].sum)
    return queryks(tree[x].l, l, ((l + r) >> 1), k);
  else
    return tree[tree[x].l].s +
           queryks(tree[x].r, ((l + r) >> 1) + 1, r, k - tree[tree[x].l].sum);
}
int main() {
  int i, j;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) scanf("%d", &a[i].l);
  for (i = 1; i <= n; i++) scanf("%d", &a[i].d);
  sort(a + 1, a + n + 1);
  maketree(root[0], 1, 200);
  for (i = 1; i <= n; i++) update(root[i], root[i - 1], 1, 200, a[i].d);
  for (i = 1; i <= n; i++) sum[i] = sum[i - 1] + a[i].d;
  for (i = 1; i <= n;) {
    int s = 0;
    for (j = i; j <= n && a[j].l == a[i].l; j++) s += a[j].d;
    s += sum[i - 1] - queryks(root[i - 1], 1, 200, max(0, i - 1 - (j - i - 1)));
    ans = max(ans, s);
    i = j;
  }
  printf("%d\n", sum[n] - ans);
  return 0;
}
