题意:有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 }