题目链接:http://codevs.cn/problem/1052/
分析
这道题考查贪心+大根堆。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100 + 10
int a[N],cnt;
int n;
struct Node {
int t,w;
bool operator < (const Node& b) const {
return t > b.t;
}
} b[N];
void push(int x)
{
a[++cnt] = x;
int i = cnt;
while(i > 1 && a[i] > a[i >> 1]) swap(a[i],a[i >> 1]),i >>= 1;
}
void pop()
{
a[1] = a[cnt--];
int i = 1,j = 2;
while(j <= cnt) {
if(j < cnt && a[j] < a[j + 1]) j |= 1;
if(a[i] < a[j]) {
swap(a[i],a[j]);
i = j,j <<= 1;
} else break;
}
}
int main()
{
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d",&b[i].t);
for(int i = 1; i <= n; i++)
scanf("%d",&b[i].w);
sort(b + 1,b + n + 1);//按时间从大到小排序
int cur = b[1].t;
int i = 1;
int ans = 0;
while(cur) {//从时间长的开始
while(cur == b[i].t) push(b[i].w),i++;
if(cnt) {
int w = a[1];
pop();
ans += w;
}
cur--;
}
printf("%d\n",ans);
return 0;
}