zoukankan      html  css  js  c++  java
  • poj1456Supermarket——并查集压缩查找

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

    排序+贪心,每次选利润最大的,放在可能的最靠后的日期卖出,利用并查集快速找到下一个符合的日期。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,t,ans,fa[10005];
    struct N{
    	int p,d;
    }a[10005],hp[10005];
    int find(int x)
    {
    	if(fa[x]==x)return x;
    	else return fa[x]=find(fa[x]);
    }
    void pus(N x)
    {
    	t++;
    	hp[t]=x;
    	int now=t;
    	while(now>1)
    	{
    		int tp=now/2;
    		if(hp[now].p>hp[tp].p)
    			swap(hp[now],hp[tp]),now=tp;
    		else break;
    	}
    }
    N del()
    {
    	N res=hp[1];
    	swap(hp[1],hp[t]);
    	t--;
    	int now=1;
    	while(now*2<=t)
    	{
    		int tp=now*2;
    		if(tp<t&&hp[tp].p<hp[tp+1].p)tp++;
    		if(hp[now].p<hp[tp].p)
    			swap(hp[now],hp[tp]),now=tp;
    		else break;
    	}
    	return res;
    }
    int main()
    {
    	while(scanf("%d",&n)==1)
    	{
    		ans=0;t=0;
    		int dmx=0;
    		memset(hp,0,sizeof hp);
    		for(int i=1;i<=n;i++)
    		{
    			scanf("%d%d",&a[i].p,&a[i].d);
    			pus(a[i]);
    			if(a[i].d>dmx)dmx=a[i].d;
    		}
    		for(int i=1;i<=dmx;i++)fa[i]=i;
    		for(int i=1;i<=n;i++)
    		{
    			N k=del();
    			int f=find(k.d);
    			if(f)
    			{
    				ans+=k.p;
    //				fa[f]=find(k.d-1);
    				fa[f]=find(f-1);
    			}
    		}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    emacs配置emacs-clang-complete-async
    emacs之配置自动安装脚本
    vim之YCM配置
    vim之vundle
    emacs之配置php
    kettle的日志
    kettle的报错解决机制
    kettle优化
    将BAT文件注册为服务的方法
    使用powerdesinger逆向生成表结构
  • 原文地址:https://www.cnblogs.com/Zinn/p/8439993.html
Copyright © 2011-2022 走看看