zoukankan      html  css  js  c++  java
  • Supermarket

    POJ

    题意:有一个商店有许多批货,每一批货又有N(0<=N<=(10^4) )个商品,同时每一样商品都有收益(P_i) ,和过期时间(D_i) (1<=(Pi,Di) <=(10^4) ),一旦超过了过期时间,商品就不能再卖。你要做的就是求出每批货最多能得到多少收益。

    方法一分析:贪心:对于每个天数t,在保证不卖出过期商品的前提下,尽量卖出收益前t大的商品。把商品按照过期时间从小到大排序,建立一个小根堆,扫描所有商品。如果过期时间等于堆的size,则与堆顶(堆中最小权值)比较,如果大于则把哪个商品挤出堆.如果过期时间大于堆的size,直接入堆即可.最后堆中商品即卖出的商品.

    //#include<bits/stdc++.h>
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    using namespace std;
    inline int read(){
        int x=0,o=1;char ch=getchar();
        while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
        if(ch=='-')o=-1,ch=getchar();
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*o;
    }
    const int N=10005;
    struct node{
    	int val,t;
    	bool operator < (const node x) const{
            return val>x.val;
        }
    }a[N];
    inline bool cmp(const node &x,const node &y){return x.t<y.t;}
    priority_queue<node>q;
    int main(){
    	int n,ans;
    	while(scanf("%d",&n)!=EOF){
    		if(!n){puts("0");continue;}
    		for(int i=1;i<=n;++i){
    			a[i].val=read();
    			a[i].t=read();
    		}
    		sort(a+1,a+n+1,cmp);
    		node temp;temp.val=a[1].val;temp.t=a[1].t;q.push(temp);
    		for(int i=2;i<=n;++i){
    			int sum=q.size();
    			if(a[i].t==sum){
    				if(a[i].val>q.top().val){
    					q.pop();
    					temp.val=a[i].val;temp.t=a[i].t;q.push(temp);
    				}
    			}
    			if(a[i].t>sum){temp.val=a[i].val;temp.t=a[i].t;q.push(temp);}
    		}
    		ans=0;
    		while(!q.empty()){ans+=q.top().val;q.pop();}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    
    

    方法二:不用堆而用并查集来做。按照收益从大到小排序。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=10005;
    int n,ans;
    int f[N];
    struct node{int t,val;}a[N];
    bool cmp(const node &x,const node &y){return x.val>y.val;}
    int find(int x){
        if(f[x]<0) return x;
        return f[x]=find(f[x]);
    }
    int main(){
        while(cin>>n){
            ans=0;
    		memset(f,-1,sizeof(f));
            for(int i=1;i<=n;i++)
    			scanf("%d%d",&a[i].val,&a[i].t);
            sort(a+1,a+1+n,cmp);
            for(int i=1;i<=n;i++){
            	int r1=find(a[i].t);
            	if(r1>0) ans+=a[i].val,f[r1]=r1-1;
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    
    
  • 相关阅读:
    2020-12
    知识的深度跟知识的广度
    限额类费用报销单N+1原则
    用友实习总结
    NC57,NC63-NC二开经验总结
    union和union all的区别
    2020
    mark_rabbitMQ
    营销之路
    怎么对ORACLE里的CLOB字段进行模糊查询
  • 原文地址:https://www.cnblogs.com/PPXppx/p/11243291.html
Copyright © 2011-2022 走看看