Supermarket POJ - 1456(贪心+并查集)

超市里有N个商品. 第i个商品必须在保质期(第di天)之前卖掉, 若卖掉可让超市获得pi的利润. 
每天只能卖一个商品.
现在你要让超市获得最大的利润. 
(原题说明过于抽象)

Input

多组数据. 
每组数据第一行为N, 即超市的商品数目
之后N行数字. 第i行为 pi, di

Output

对于每一组数据, 输出当前条件下超市的最大利润

Sample Input

4 
50 2  
10 1   
20 2   
30 1

7  
20 1   
2 1   
10 3  
100 2   
8 2   
5 20  
50 10

Sample Output

80
185

这题数据水了

根据数据范围完全可以将暴力卡掉

并查集类似记忆化搜索

对于充分的操作只会执行一次

所以可以优化此题

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int father[100005];
pair<int,int>a[100005];
int fin(int x)
{
    if(father[x]==x) return x;
    return father[x]=fin(father[x]);
}
int cmp(pair<int,int>p ,pair<int,int> q)
{
    return p.first>q.first;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i].first,&a[i].second);
    }
    for(int i=0;i<=100000;i++)
        father[i]=i;
    sort(a+1,a+1+n,cmp );
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        int tmp=fin(a[i].second);
        if(tmp==0)
            continue;
        else
        {
            father[tmp]=fin(tmp-1);
            ans+=a[i].first;
        }
    }
    printf("%d\n",ans);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值