• HDU-ACM“菜鸟先飞”冬训系列赛——第8场(1004)


    Problem D###

    Time Limit : 3000/3000ms (Java/Other)
    Memory Limit : 65535/102400K (Java/Other)
    Problem Description
    ZYJ手上有一张地图,地图上面有着森林里面各个热带水果的坐标,例如菠萝,凤梨,番茄,西红柿什么的。ZYJ要根据地图上面的指引去采水果回来制作成果汁。
    因为如果水果相隔太远,口味就会相差很大,所以ZYJ要求,一个水果只能用于制作一杯果汁,而且,如果果汁里面的成分多于一个水果,那么对于加到果汁里面的每一个水果a,都必须有一个在地图上面与之相距不超过D的水果b在果汁里面。例如如果加到果汁里面的只有两个苹果(友情加注提示:这两个是不同位置,同一种类的水果),那么这两个苹果在地图上面的距离不能超过D。但是如果果汁里有3个水果ABC,AB的距离小于D,BC的距离小于D,AC的距离大于D,这样是合法的,因为对于ABC中的任意一个都能找到另一个与之相距不超过D的水果在里面。
    现在问题就是,你能知道最后ZYJ的那杯果汁里面最多能含有多少种水果吗?注意是多少种不是多少个。
    Input
    输入包含多组数据。
    对于每组数据,第一行是三个整数N,K,D(0< N ≤3000, 0< K ≤32, 0< D≤10000)
    N代表水果个数,K代表水果种类数,D如题中所述。
    接下来N行,每行包含一个字符串S,两个整数X和Y。(0≤X,Y≤10000)
    S代表水果的名称(|S|≤20), X和Y代表这个水果在地图上面的横纵坐标。
    Output
    对于每组数据,输出ZYJ的那杯果汁里面最多能含有多少种水果
    Sample Input
    10 3 1
    apple 0 0
    banaba 0 1
    apple 1 0
    watermelon 3 0
    pineapple 4 0
    apple 4 1
    banaba 2 1
    banaba 2 2
    watermelon 1 2
    watermelon 3 2
    Sample Output
    3

    题意
    找到一个含水果种数最多的集合,集合内元素至少与其他一个元素相连,满足距离(<d)

    分析
    典型并查集的题目,遍历每一个水果,将其标号,再遍历一遍,每次找与其距离小于(d)的水果,若可以则加入集合,并且父亲的水果种数+1,最后遍历取最大值

    代码

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <ctime>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <bitset>
    using namespace std;
    
    #define ll long long
    #define F(i,a,b) for(int i=a;i<=b;++i)
    #define R(i,a,b) for(int i=a;i<b;++i)
    #define mem(a,b) memset(a,b,sizeof(a))
    #define cpy(a,b) memcpy(a,b,sizeof(b))
    #pragma comment(linker, "/STACK:102400000,102400000")
    inline void read(int &x){x=0; char ch=getchar();while(ch<'0') ch=getchar();while(ch>='0'){x=x*10+ch-48; ch=getchar();}}
    
    int n,k,d,vis[3030][3030],fa[3030],cnt[3030],x[3030],y[3030],ret;
    map<string,int>q;
    string s[3030];
    int find(int x)
    {
        return fa[x]=(x==fa[x])?x:find(fa[x]);
    }
    bool check(int i,int j)
    {
        return ((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])<=d*d)?1:0;
    }
    int main()
    {
        while(scanf("%d%d%d",&n,&k,&d)==3)
        {
            q.clear();
            mem(vis,0);mem(cnt,0);ret=0;
            F(i,1,n) fa[i]=i;
            F(i,1,n)
            {
                cin>>s[i];scanf("%d%d",x+i,y+i);
                if(!q[s[i]]) q[s[i]]=++ret;
            }
            F(i,1,n)
            {
                F(j,i+1,n)
                {
                    if(check(i,j))
                    {
                        int fx=find(i);
                        int fy=find(j);
                        if(fx!=fy) fa[fy]=fx;//若不加fx!=fy wa
                    }
                }
            }
            int ans=0;
            F(i,1,n) if(vis[find(i)][q[s[i]]]==0) { vis[find(i)][q[s[i]]]=1;cnt[find(i)]++;ans=max(ans,cnt[find(i)]); }
            printf("%d
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    忙碌的一月
    SharePoint Portal Server 2003书籍计划最新进展
    如何判断Assembly是Debug还是Release?
    C#和C++的一个有意思的差别
    Enterprise Development Reference Architecture(ShadowFax)
    一个“轻量级”的SharePoint文档流转WebPart
    11月25日下午14:00,CSDN在线SharePoint TechTalk
    到北京后的第一篇随笔
    SOA & Messaging Patterns
    操作SharePoint Object Model完成两项操作的文档
  • 原文地址:https://www.cnblogs.com/chendl111/p/6389024.html
Copyright © 2020-2023  润新知