1 #include <string.h> 2 #include <iostream> 3 #include <queue> 4 #include <stdio.h> 5 6 using namespace std; 7 8 struct product{ 9 int deadline; 10 int val; 11 friend bool operator<(product n1,product n2) 12 { 13 return n1.val<n2.val; 14 } 15 }q; 16 17 bool mark[10005]; 18 19 int main() 20 { 21 // freopen("in.txt","r",stdin); 22 priority_queue<product> s; 23 int m; 24 while(scanf("%d",&m)!=EOF) 25 { 26 for(int i=0;i<m;i++) 27 { 28 scanf("%d%d",&q.val,&q.deadline); 29 s.push(q); 30 } 31 memset(mark,true,sizeof(mark)); 32 int ans=0; 33 while(!s.empty()) 34 { 35 q=s.top(); 36 s.pop(); 37 for(int i=q.deadline;i>=1;i--) 38 { 39 if(mark[i]) { 40 ans+=q.val; 41 mark[i]=false; 42 break; 43 } 44 } 45 } 46 printf("%d ",ans); 47 } 48 return 0; 49 }
http://poj.org/problem?id=1456
题意:在超市里,每一件物品都是有保质期的,而这个超市每卖一件商品所需要的时间是一天,问,在保质期结束前,可获得的最大利润是多少。
思路:有人说可以用并查集,但我做的并查集的题目不多,理解也不是很深,所以我也不知道怎么用并查集来做,但是,这道题很明显就是一个贪心的题目,所以我用的贪心的办法做的。首先,把商品按利润从大到小来进行排个序,然后把每一件商品都先试着在截止日期那天卖出去,如果那天被其他的商品占用了的话,那么在往前推一天,这样就可以求出最大利润。
我是用优先队列来做的。首先构造一个包含截止日期和价值的结构体,并在里面写个判断的操作。
然后构建一个结构体类的优先队列就可以了。
由于优先队列不怎么会,然后我还是以为优先队列的队顶是front,其实是top