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\n",ans);
}
return 0;
}

HDU-ACM“菜鸟先飞”冬训系列赛——第8场(1004)的更多相关文章

  1. HDU-ACM“菜鸟先飞”冬训系列赛——第7场 H

    Problem H Problem Description 小边为了寻找梦寐以求的骨头误入一个迷宫,它灵敏的嗅觉告诉它,在迷宫中的某一处有一块完美的骨头.由于迷宫会在一段时间后关闭,所以小边必须在一定 ...

  2. HDU-ACM“菜鸟先飞”冬训系列赛——第10场

    Problem A 题意 给出l(房子宽度),d(pole距离房子的垂直距离),s(绳子长度),求可覆盖的面积 分析 一共四种情况 \[1.s<=d\] \[2.s<=sqrt(d*d+l ...

  3. HDU-ACM“菜鸟先飞”冬训系列赛——第9场

    Problem A 题意 一对兔子每月生一对兔子,兔子在\(m\)月后成熟,问\(d\)月后有多少兔子 分析 可以发现,第i月的兔子数量取决于第i-1月与i-m月,故 \(a[i]=a[i-1]+a[ ...

  4. hdu acm 1028 数字拆分Ignatius and the Princess III

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  5. Entity Framework菜鸟初飞

    Entity Framework菜鸟初飞 http://blog.csdn.net/zezhi821/article/details/7235134

  6. hdu 5418 (Floyd+哈密顿) 飞向世界

    http://acm.hdu.edu.cn/showproblem.php?pid=5418 题目大意是城市的编号是1到n,给出m条路线,表示从a城市飞到b城市飞机要耗多少油,最后问飞机从1出发飞过所 ...

  7. hdu acm 1166 敌兵布阵 (线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  8. hdu acm 2082 找单词

    找单词 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. HDU ACM 1325 / POJ 1308 Is It A Tree?

    Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

随机推荐

  1. 全新开始fighting

    a.python准备工作 Python种类: JPython   IronPython    JavaScriptPython   RubyPython   CPython    ********** ...

  2. Eclipse移植项目时JDK版本不匹配Project facet Java version 1.7 is not supported

    Eclipse移植项目时JDK版本不匹配Project facet Java version 1.7 is not supported 如果原有项目用的为JDK1.7,而自己的是低版本JDK,比如1. ...

  3. Eclipse的Servers视图中无法添加Tomcat6/Tomcat7

    原文:http://blog.csdn.net/blueheart20/article/details/40043749 问题的提出: 无法从以下方式,添加Tomcat服务器.  其中ServerNa ...

  4. office outlook 無法開啟 outlook 視窗

    例如[無法啟動Microsoft Office Outlook.無法開啟Outlook 視窗.] 1.啟動 Outlook 安全模式outlook.exe /safe2.清除並重新產生目前設定檔的功能 ...

  5. Android中AsyncTask使用具体解释

    在Android中我们能够通过Thread+Handler实现多线程通信.一种经典的使用场景是:在新线程中进行耗时操作.当任务完毕后通过Handler向主线程发送Message.这样主线程的Handl ...

  6. POJ 3488 &amp; HDU 1915 Arne Saknussemm(模拟)

    题目链接: POJ:http://poj.org/problem? id=3488 HDU:pid=1915">http://acm.hdu.edu.cn/showproblem.ph ...

  7. iOS中3种正则表达式的使用

    1.利用NSPredicate(谓词)匹配 例如匹配有效邮箱: ? 1 2 3 4 NSString *email = @“nijino_saki@163.com”:  NSString *regex ...

  8. Python筛选法(算出十亿之内所有的质数之和)

    其实别人写的挺好的了....直接上链接吧http://blog.csdn.net/power721/article/details/8216619

  9. strtok函数

    strtok函数是cstring文件里的函数 strtok函数是cstring文件里的函数 其功能是截断字符串 原型为:char *strtok(char s[],const char *delin) ...

  10. vsCode 常用快捷键(mac 版)

    光标多行显示: commond+Alt+topArrow/downArrow 查找:commond+F 查找并按顺序切换下一个:commond+G 跳转到某一行: ctrl+G 输入行号跳转 跳转到某 ...