zoukankan      html  css  js  c++  java
  • P2279 [HNOI2003]消防局的设立

    之前拿dp写过一次。炸了。但就一直烂在哪里了。

    昨天同学胡策。出到了一部分。说使用贪心做。时间复杂度是(O(nk))的。其中k是半径。

    然后就学习了一波。

    当然这道题是只考虑点支配(差不多)

    感觉这个贪心很妙

    大体就是按照深度,处理出多少级祖先来,然后贪心。

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstdlib>
    #include<cstring>
    using std::sort;
    using std::min;
    const int maxn=101000;
    int f[maxn],d[maxn],dis[maxn];
    int tmp[maxn];
    bool compare(int a,int b)
    {
        return d[a]>d[b];
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        dis[0]=dis[1]=n;
        for(int i=2;i<=n;i++)
        {
            scanf("%d",&f[i]);
            dis[i]=n;
            d[i]=d[f[i]]+1;
        }
        for(int i=1;i<=n;i++)   tmp[i]=i;
        sort(tmp+1,tmp+n+1,compare);
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            int pas=tmp[i];
            int F1=f[pas];
            int F2=f[F1];
            dis[pas]=min(dis[pas],min(dis[F1]+1,dis[F2]+2));
            if(dis[pas]>2)
            {
                ans++;
                dis[F2]=0;
                dis[f[F2]]=min(dis[f[F2]],1);
                dis[f[f[F2]]]=min(dis[f[f[F2]]],2);
            }
        }
        printf("%d",ans);
    }
    
    
  • 相关阅读:
    ref和out的区别
    final、finally、finalize的区别
    get和post的区别
    什么是事务
    锁的详细
    什么是游标
    什么是存储过程
    委托的来由
    多线程的秘密
    String str=null; 和String str=""的区别
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/9895092.html
Copyright © 2011-2022 走看看