• poj1456 supermarket---贪心+并查集优化


    题目链接:https://vjudge.net/problem/POJ-1456#author=yuming

    题意:N个商品. 第i个商品必须在保质期第di天前卖掉, 若卖掉可获得pi的利润。每天只能卖一个商品,求最大利润

    主要想法还是贪心,一是尽量卖出利润大的物品,二是物品尽量在靠近保质期的日期出售。于是先按照pi排序,之后按利润从大到小考虑。对于当前的物品,如果保质期内有某天可以卖掉,就在最靠近保质期的那天卖掉,并且给那一天打上标记。要找到最靠近保质期的那天,可以直接暴力枚举,也可以用并查集优化,代码都很短

    直接枚举(数据估计水了,125ms过)

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    
    using namespace std;
    const int maxn=1e4+10;
    int t,n,i,j,k,u[maxn];
    struct st{int p,d;}a[maxn];
    
    bool cmp(st x,st y){return x.p>y.p;}
    
    int main(){
    	while (~scanf("%d",&n)){
    	  for (i=1;i<=n;i++) scanf("%d%d",&a[i].p,&a[i].d);
    	  sort(a+1,a+n+1,cmp);
    	  memset(u,0,sizeof(u));
    	  int ans=0;
    	  for (i=1;i<=n;i++){
    	  	for (j=a[i].d;j>=1;j--)
    	  	  if (!u[j]){u[j]=1; break;}
    	  	if (j) ans+=a[i].p;
    	  }
    	  printf("%d
    ",ans);
    	}
    	return 0;
    }
    

    并查集优化:

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    
    using namespace std;
    int n,i,j,k,u[10010];
    struct st{int p,d;}a[10010];
    
    bool cmp(st x,st y){return x.p>y.p;}
    int find(int x){return u[x]==-1?x:u[x]=find(u[x]);}
    
    int main(){
    	while (~scanf("%d",&n)){
    	  for (i=1;i<=n;i++) scanf("%d%d",&a[i].p,&a[i].d);
    	  sort(a+1,a+n+1,cmp);
    	  memset(u,-1,sizeof(u));
    	  int ans=0;
    	  for (i=1;i<=n;i++){
    	  	int k=find(a[i].d);  
    	  	if (k){ans+=a[i].p; u[k]=k-1;}
    	  }
    	  printf("%d
    ",ans);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    initData()
    moveUp()
    moveLeft()
    moveDown()
    函数具体分析
    Linux命令学习笔记
    RocketMQ使用记录
    solr安装记录
    centos7下面ruby的升级
    centos7下面装fastdfs
  • 原文地址:https://www.cnblogs.com/edmunds/p/13549573.html
Copyright © 2020-2023  润新知