(CodeForces

来源:互联网 发布:淘宝用什么打折软件 编辑:程序博客网 时间:2024/06/04 00:57

(CodeForces - 557C)Arthur and Table

time limit per test:1 second
memory limit per test:256 megabytes
input:standard input
output:standard output

Arthur has bought a beautiful big table into his new flat. When he came home, Arthur noticed that the new table is unstable.

In total the table Arthur bought has n legs, the length of the i-th leg is li.

Arthur decided to make the table stable and remove some legs. For each of them Arthur determined number di — the amount of energy that he spends to remove the i-th leg.

A table with k legs is assumed to be stable if there are more than half legs of the maximum length. For example, to make a table with 5 legs stable, you need to make sure it has at least three (out of these five) legs of the maximum length. Also, a table with one leg is always stable and a table with two legs is stable if and only if they have the same lengths.

Your task is to help Arthur and count the minimum number of energy units Arthur should spend on making the table stable.

Input

The first line of the input contains integer n (1 ≤ n ≤ 105) — the initial number of legs in the table Arthur bought.

The second line of the input contains a sequence of n integers li (1 ≤ li ≤ 105), where li is equal to the length of the i-th leg of the table.

The third line of the input contains a sequence of n integers di (1 ≤ di ≤ 200), where di is the number of energy units that Arthur spends on removing the i-th leg off the table.

Output

Print a single integer — the minimum number of energy units that Arthur needs to spend in order to make the table stable.

Examples

Input

2
1 5
3 2

Output

2

Input

3
2 4 4
1 1 1

Output

0

Input

6
2 2 1 1 3 3
4 3 5 5 2 1

Output

8

题目大意:一个有n条腿的桌子,要使最长的那条腿的数量大于总腿数的一半,拆掉第i条腿需要的代价是d[i],问要使桌子合法所要消耗的最小代价是多少。

思路:我们可以考虑先枚举桌子最后支撑腿的长度x。因为是支撑腿,意味着所有大于x的腿都要被砍掉。对于支撑腿,显然全部保留最好。接下来就是按照代价从小到大砍腿。由于代价最多200,可以借鉴桶排思想,将小于x的腿代价放入桶内。从小到大扫一遍桶砍腿直到满足要求即可即可。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;const int maxn=100005;int num[maxn],bigger[maxn];//num记录腿长为l的腿数,bigger记录腿长大于l的代价 int cost[205];//记录代价为i的有多少条 struct node{    int l,d;}a[maxn];bool cmp(node a,node b){    return a.l<b.l;}int main(){    int n;    while(~scanf("%d",&n))    {        memset(num,0,sizeof(num));        memset(bigger,0,sizeof(bigger));        memset(cost,0,sizeof(cost));        for(int i=0;i<n;i++)         {            scanf("%d",&a[i].l);            num[a[i].l]++;        }        for(int i=0;i<n;i++) scanf("%d",&a[i].d);        sort(a,a+n,cmp);        int sum=0;        for(int i=n-1;i>0;i--)        {            sum+=a[i].d;            if(a[i].l!=a[i-1].l) bigger[a[i-1].l]=sum;        }        int ans=bigger[a[0].l];        cost[a[0].d]++;        for(int i=1;i<n;i++)        {            if(a[i].l!=a[i-1].l)            {                int tmp=i-num[a[i].l]+1;//需要减掉的腿的数量                sum=bigger[a[i].l];                if(tmp>0)                {                    for(int j=1;j<=200;j++) //从小到大减去tmp条腿                        if(cost[j])                        {                            if(cost[j]>=tmp)                            {                                sum+=j*tmp;                                tmp=0;                                break;                            }                            else                            {                                sum+=j*cost[j];                                tmp-=cost[j];                            }                        }                 }                 ans=min(ans,sum);            }            cost[a[i].d]++;        }        printf("%d\n",ans);         }    return 0;}
原创粉丝点击