【并查集的另一个思考方向】POJ1456

POJ1456

这个题一看好像就是用贪心做啊,一个结构体,拍一下序,vis数组一遍遍扫荡,最后输出值,没错,贪心的确能做出来,而这类题目也能应用并查集,实现得思想也是贪心

#include <iostream>
#include <string.h>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e4 + 1e2;
int pre[maxn];
int n;
struct node
{
    int p,d;
}obj[maxn];
void init()
{
    for(int i = 0;i < maxn;i++)
    {
        pre[i] = i;
    }
    memset(obj,0,sizeof(obj));
}
bool cmp(node a,node b)
{
    return a.p > b.p;
}

 一开始都差不多哈,并查集pre【i】得含义是第i天前第一个空得天数是第几天!!(差不多了吧和你反向暴力一遍vis数组貌似差不多)

但是并查集能路径压缩欸

int Find(int x)
{
    if(x != pre[x])
    {
        int tem = pre[x];
        pre[x] = Find(tem);
    }
    return pre[x];
}
int main()
{
    int n,a,d;
    while(~scanf("%d",&n))
    {
        init();
        for(int i = 0;i < n;i++)
        {
            scanf("%d%d",&obj[i].p,&obj[i].d);
        }
        sort(obj,obj+n,cmp);
        int ans = 0;
        for(int i = 0;i < n;i++)
        {
            int r = Find(obj[i].d);
            if(r > 0)
            {
                ans += obj[i].p;
                pre[r] = r - 1;
            }
        }
        printf("%d
",ans);
    }
    return 0;
}

 这个题并不算难,主要是提供了另一个思考的方向吧,现在不是出初中高中得应试阶段,每一个类型都有固定得做法,而ACM这种题,就应该去创新的想一想,去应用更多好玩得数据结构,去做更多好玩得事情

原文地址:https://www.cnblogs.com/DF-yimeng/p/8619825.html