这道题,并查集+贪心。
用f [ i ] 表示 小于等于 i 的最大的可用的天数。
先将商品按价值排序,然后从价值最高的开始先放,从截止日期开始往前放,即放在 f [ deadline ] 的地方。
int n;
int f[10001];
struct goods{
int value,deadline;
bool operator <(const goods&b)const{
return value<b.value;
}
}good[10001];
定义了结构体,重载小于运算符,方便排序。
int get(int a){
if(a<1) return 0;
int r=a;
while(r!=f[r]){
r=f[r];
}
return f[a]=r;
}
get函数,查找小于等于a的最大空缺位置。
int main(void)
{
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=10000;i++) f[i]=i; //并查集初始化
int pi,di;
FOR(i,n) {
scanf("%d%d",&pi,&di);
good[i].value=pi;
good[i].deadline=di;
}
sort(good+1,good+n+1);//排序
int ANS=0;
for(int i=n;i>0;--i){
int pos=get(good[i].deadline);
f[pos]=get(pos-1);
if(pos) ANS+=good[i].value;//如果找到位置放,就加上它的价值。
}
cout<<ANS<<endl;
}
return 0;
}