最近忙着考试,根本没有时间刷题==,突然发现小X在不停的刷CF,默默攒下了,嗯,上场的C真心没有想法,归根结底还是暴力,贴下别人的代码把,我是看他的思路做的,现在多少是明白了。这题归根还是想法,确实是没有想到那里。
#include <bits/stdc++.h>
#define LOCAL
#define ll long long
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0x7fffffff
#define mod 1000000007
#define For(i,n) for(i=0;i<n;i++)
using namespace std;
int m[MAX];
int sum = 0;
struct node
{
int l;
int d;
bool operator < (const node &b)const
{
return l > b.l;
}
} p[MAX];
int main()
{
//freopen("data.txt","r",stdin);
int n,i;
memset(m,0,sizeof(m));
scanf("%d",&n);
for(i = 0; i<n; i++)scanf("%d",&p[i].l);
for(i = 0; i<n; i++)
{
scanf("%d",&p[i].d);
sum+=p[i].d;
m[p[i].d]++;
}
sort(p,p+n);//长度从大到小排序
/*for(i = 0;i<n;i++)
{
cout<<p[i].len<<" "<<p[i].d<<endl;
}*/
int res = 0,temp = 0, cnt = 0;
for(i = 0; i<=n; i++) //枚举长度,等于n是把最后也算进去
{
if(i==0||p[i].l==p[i - 1].l)
{
temp+=p[i].d;//当前长度下的总消耗
m[p[i].d]--;
cnt++;//这种长度有多少个
}
else
{
for(int k=200; k>=1; k--) //判断力气,剩下的cnt - 1个是什么都可以,只要保证力气足够大
{
if(m[k]>0)
{
if(m[k]<=cnt-1)
{
temp+=m[k]*k;
cnt-=m[k];
}
else
{
temp+=(cnt- 1)*k;//直接消耗了num-1个
cnt = 1;
}
}
if(cnt<=1)break;
}
res = max(res,temp);
temp = p[i].d;
cnt = 1;
m[p[i].d]--;
}
}
printf("%d\n",sum - res);
return 0;
}