zoukankan      html  css  js  c++  java
  • 油菜花王国——杭电校赛(并查集)

     

    油菜花王国

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1609    Accepted Submission(s): 411


    Problem Description
      程序设计竞赛即将到来,作为学校ACM集训队主力,小明训练一直很努力。今天天气不错,教练也心情大好,破例给各位队员放假一天,小明就骑着自己的小电驴到郊外踏青去了。

      出城不久,小明看到一大片油菜花,忍不住眼前美景的诱惑,就拐了进去,谁曾想,这一拐却误入了油菜花王国!

      油菜花王国生存着一大批油菜花精灵,这是一种特别热爱斐波那契数列的生物。在这个国度里,有若干个家族,每只精灵都只属于一个家族。精灵出生时,身上都会印着一个编码,表示这只精灵的能力值,如果这个能力值正好存在于斐波那契数列,那么他就会为所在的家族增加一点威望。小明通过和精灵们聊天,知道了所有精灵之间的关系。

      现在,小明想知道油菜花王国里威望值最大的家族的威望值是多少,你能帮帮他吗?小明会把精灵们之间的关系网络告诉你,由于整个关系网络实在太庞大,所以小明很有可能重复介绍其中一些关系。
     
    Input
    输入包含多组数据。

    每组数据第一行包含两个整数 n (1 <= n <= 1000) 、 m (1 <= m <= 5000) ,分别表示油菜花王国精灵数量和精灵之间关系组数。
    第二行包含 n 个整数,表示精灵们的能力值 k (1 <= k <= 1000000000)。
    接下去有 m 行,每行有两个不同的整数 u 、 v (1 <= u, v <= n) ,表示精灵 u 和精灵 v 属于同一个家族。
     
    Output
    请输出威望值最大的家族的威望值,每组数据对应一行输出。
     
    Sample Input
    2 1 1 4 1 2
     
    Sample Output
    1

    题目大意:

    中文题能看懂就不说意思了   

    斐波那契数列

    f[0]=0;f[1]=1;

    f[i]=f[i-1]+f[i-2];

    上代码

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    
    using namespace std;
    #define N 10005
    int fei[N];
    int f[N];
    
    int Find(int x)
    {
        if(x!=f[x])
            f[x]=Find(f[x]);
        return f[x];
    }
    int main()
    {
        int Maxn;
        fei[0]=1;
        fei[1]=2;
        for(int i=2;fei[i-1]<1000000000;i++)
        {
            fei[i]=fei[i-1]+fei[i-2];
            Maxn=i;
        }
        int n,m,k,u,v,r[N];
        while(scanf("%d %d",&n,&m)!=EOF)
        {
            memset(r,0,sizeof(r));
            for(int i=1;i<=n;i++)
            {
                f[i]=i;
                scanf("%d",&k);
                int index=lower_bound(fei,fei+Maxn,k)-fei;
                if(fei[index]==k)
                    r[i]++;
            }
            for(int i=0;i<m;i++)
            {
                scanf("%d %d",&u,&v);
                int fu=Find(u);
                int fv=Find(v);
                if(fu!=fv)
                {
                    f[fu]=fv;
                    r[Find(fu)]=r[fu]+r[fv];
                }
            }
            int Max=0;
            for(int i=1;i<=n;i++)
            {
                if(f[i]==i)
                    Max=max(Max,r[i]);
            }
            printf("%d
    ",Max);
        }
        return 0;
    }
  • 相关阅读:
    SDUT 2143 图结构练习——最短路径 SPFA模板,方便以后用。。 Anti
    SDUT ACM 1002 Biorhythms 中国剩余定理 Anti
    nyist OJ 119 士兵杀敌(三) RMQ问题 Anti
    SDUT ACM 2157 Greatest Number Anti
    SDUT ACM 2622 最短路径 二维SPFA启蒙题。。 Anti
    二叉索引树 区间信息的维护与查询 Anti
    SDUT ACM 2600 子节点计数 Anti
    UVA 1428 Ping pong 二叉索引树标准用法 Anti
    2010圣诞Google首页效果
    Object
  • 原文地址:https://www.cnblogs.com/linliu/p/5005279.html
Copyright © 2011-2022 走看看