POJ 1456(贪心)

 

 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\n",ans);
47     }
48     return 0;
49 }

 

 

http://poj.org/problem?id=1456

题意:在超市里,每一件物品都是有保质期的,而这个超市每卖一件商品所需要的时间是一天,问,在保质期结束前,可获得的最大利润是多少。

思路:有人说可以用并查集,但我做的并查集的题目不多,理解也不是很深,所以我也不知道怎么用并查集来做,但是,这道题很明显就是一个贪心的题目,所以我用的贪心的办法做的。首先,把商品按利润从大到小来进行排个序,然后把每一件商品都先试着在截止日期那天卖出去,如果那天被其他的商品占用了的话,那么在往前推一天,这样就可以求出最大利润。

 

我是用优先队列来做的。首先构造一个包含截止日期和价值的结构体,并在里面写个判断的操作。

然后构建一个结构体类的优先队列就可以了。

由于优先队列不怎么会,然后我还是以为优先队列的队顶是front,其实是top

 

posted @ 2016-07-28 10:33  一个_小菜鸟  阅读(164)  评论(0编辑  收藏  举报