poj 1456 贪心+STL

题意:有n个商品,每个商品如果能在截止日期之前售出就会获得相应利益,求能获得的最大利益

一开始对每个时间进行贪心,后来发现后面的商品可以放到之前来卖,然后就wa了

这里就直接对价格排序,把物品尽量放到最后卖,如果在这个时间有物品卖了,就往前卖,直到前面所有的时间都满了

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 #define MOD 1000000007
10 const int INF=0x3f3f3f3f;
11 const double eps=1e-5;
12 typedef long long ll;
13 #define cl(a) memset(a,0,sizeof(a))
14 #define ts printf("*****
");
15 const int MAXN=10005;
16 int n,m,tt;
17 struct node
18 {
19     int p,d;
20     node(){}
21     friend bool operator< (node a,node b)
22     {
23         if(a.p==b.p)    return a.d<b.d;
24         else return a.p<b.p;
25     }
26 }nn[MAXN];
27 priority_queue<node> q;
28 bool vis[MAXN];
29 int main()
30 {
31     int i,j,k;
32     #ifndef ONLINE_JUDGE
33     freopen("1.in","r",stdin);
34     #endif
35     while(scanf("%d",&n)!=EOF)
36     {
37         while(!q.empty())   q.pop();
38         for(i=0;i<n;i++)
39         {
40             scanf("%d%d",&nn[i].p,&nn[i].d);
41             q.push(nn[i]);
42         }
43         int t=1,sum=0;
44         cl(vis);
45         while(!q.empty())
46         {
47             node qq=q.top();
48             //printf("%d %d
",qq.p,vis[qq.d]);
49             if(vis[qq.d]==1)    //已经放过了就往前放
50             {
51                 while(qq.d>=1)
52                 {
53                     if(!vis[qq.d])
54                     {
55                         vis[qq.d]=1;
56                         break;
57                     }
58                     qq.d--;
59                 }
60                 if(qq.d>0) //放入成功
61                 {
62                     sum+=qq.p;
63                 }
64             }
65             else
66             {
67                 sum+=qq.p;
68                 vis[qq.d]=1;
69             }
70             q.pop();
71         }
72         printf("%d
",sum);
73     }
74 }
原文地址:https://www.cnblogs.com/cnblogs321114287/p/4486827.html