堆+快排
按照时间从大到小排序,然后倒着来。
使用最大堆。
附代码,可自行理解。
#include<cstdio>
#include<cstdlib>
const int maxn=102;
int n,time[maxn],score[maxn],q[maxn],s;
int ans;
void swap(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}
void up(int i)
{
int j=i/2;
if(j>0&&q[i]>q[j])
{
swap(q[i],q[j]);
up(j);
}
}
void down(int i)
{
int j=i*2;
if(j+1<=s&&q[j]<=q[j+1])
j++;
if(j<=s&&q[i]<q[j])
{
swap(q[i],q[j]);
down(j);
}
}
void push(int k)
{
s++;
q[s]=k;
up(s);
}
void pop()
{
swap(q[1],q[s]);
s--;
down(1);
}
void sort(int l,int r)
{
int key=time[rand()%(r-l+1)+l];
int i=l,j=r;
while(i<=j)
{
while(time[i]>key)
i++;
while(time[j]<key)
j--;
if(i<=j)
{
swap(time[i],time[j]);
swap(score[i],score[j]);
i++;
j--;
}
}
if(l<j)
sort(l,j);
if(i<r)
sort(i,r);
}
int main()
{
srand(909978797);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&time[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&score[i]);
}
sort(1,n);
int j=1;
for(int i=time[1];i>0;i--)
{
while(i<=time[j])
{
push(score[j]);
j++;
}
if(s)
{
ans+=q[1];
pop();
}
}
printf("%d\n",ans);
return 0;
}