题意:给定若干商品,每种商品有两个属性,一个是其售价,另一个是其最晚售出时间,超过这个时间此商品就算作废。每单位时间最多出售一种商品。给定出n个商品的属性值,问怎样安排这些商品能使得利益最大(假设商品想卖就卖)。
思路:一开始自己的思路是按照截止时间从大到小排序,相同的截止时间按照售价从大到小排序,每次挑截止时间最大且售价最大的那个,然后将剩下中的和选出截止时间相同的时间都减1,再排序。每轮都排序浪费时间所以TLE,不知道这个思路加优先队列优化行不行……
正确的思路是按照售价从大到小排序,用并查集优化。那么find(x)表示x时间之前最大的可出售时间。
#include <stdio.h>
#define N 10005
struct node{
int t,w;
}p[N];
int n,father[N];
int cmp(const struct node *a,const struct node *b){
if((*a).w == (*b).w)
return (*b).t - (*a).t;
return (*b).w - (*a).w;
}
int find(x){
if(father[x] == x)
return x;
return father[x] = find(father[x]);
}
int main(){
freopen("a.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
int i,j,res=0;
for(i = 0;i<N;i++)
father[i] = i;
for(i = 0;i<n;i++)
scanf("%d %d",&p[i].w,&p[i].t);
qsort(p,n,sizeof(struct node),cmp);//按照售价排序
for(i = 0;i<n;i++){
int temp = find(p[i].t);//可出售的最大位置
if(temp){//如果有位置
res += p[i].w;
father[temp] = find(temp-1);//此位置不行了,并查集连接到下一位置
}
}
printf("%d\n",res);
}
return 0;
}