2429: [HAOI2006]聪明的猴子

2429: [HAOI2006]聪明的猴子

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 448  Solved: 309
[ Submit][ Status][ Discuss]

Description

在一个热带雨林中生存着一群猴子,它们以树上的果子为生。昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上。猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面的不同树冠上来回穿梭,以找到喜欢吃的果实。
现在,在这个地区露出水面的有N棵树,假设每棵树本身的直径都很小,可以忽略不计。我们在这块区域上建立直角坐标系,则每一棵树的位置由其所对应的坐标表示(任意两棵树的坐标都不相同)。
在这个地区住着的猴子有M个,下雨时,它们都躲到了茂密高大的树冠中,没有被大水冲走。由于各个猴子的年龄不同、身体素质不同,它们跳跃的能力不同。有的猴子跳跃的距离比较远(当然也可以跳到较近的树上),而有些猴子跳跃的距离就比较近。这些猴子非常聪明,它们通过目测就可以准确地判断出自己能否跳到对面的树上。
【问题】 现已知猴子的数量及每一个猴子的最大跳跃距离,还知道露出水面的每一棵树的坐标,你的任务是统计有多少个猴子可以在这个地区露出水面的所有树冠上觅食。

Input

第1行为一个整数,表示猴子的个数M(2<=M<=500);

第2行为M个整数,依次表示猴子的最大跳跃距离(每个整数值在1--1000之间);

第3行为一个整数表示树的总棵数N(2<=N<=1000);

第4行至第N+3行为N棵树的坐标(横纵坐标均为整数,范围为:-1000--1000)。

(同一行的整数间用空格分开)

 

Output

包括一个整数,表示可以在这个地区的所有树冠上觅食的猴子数

 

Sample Input

4
1 2 3 4
6
0 0
1 0
1 2
-1 -1
-2 0
2 2

Sample Output

3

HINT

 

对于40%的数据,保证有2<=N <=100,1<=M<=100


对于全部的数据,保证有2<=N <= 1000,1<=M=500


 


 

 

Source

Day2

 

题解:一个裸的最小生成树,直接求出来之后判断下就是了= =

 1 /**************************************************************
 2     Problem: 2429
 3     User: HansBug
 4     Language: Pascal
 5     Result: Accepted
 6     Time:396 ms
 7     Memory:11976 kb
 8 ****************************************************************/
 9  
10 var
11    i,j,k,l,m,n,mm:longint;
12    b:array[0..2000,1..2] of longint;
13    a:array[0..1000005,1..3] of longint;
14    c,d:array[0..2000] of longint;
15 function max(x,y:longint):longint;inline;
16          begin
17               if x>y then max:=x else max:=y;
18          end;
19 procedure swap(var x,y:longint);inline;
20           var z:longint;
21           begin
22                z:=x;x:=y;y:=z;
23           end;
24 procedure sort(l,r:longint);inline;
25           var i,j,x,y:longint;
26           begin
27                i:=l;j:=r;x:=a[(l+r) div 2,3];
28                repeat
29                      while a[i,3]<x do inc(i);
30                      while a[j,3]>x do dec(j);
31                      if i<=j then
32                         begin
33                              swap(a[i,1],a[j,1]);
34                              swap(a[i,2],a[j,2]);
35                              swap(a[i,3],a[j,3]);
36                              inc(i);dec(j);
37                         end;
38                until i>j;
39                if i<r then sort(i,r);
40                if l<j then sort(l,j);
41           end;
42 function getfat(x:longint):longint;inline;
43          begin
44               if x<>c[x] then c[x]:=getfat(c[x]);
45               exit(c[x]);
46          end;
47 begin
48      readln(m);
49      for i:=1 to m do read(d[i]);
50      readln;l:=0;readln(n);
51      for i:=1 to n do readln(b[i,1],b[i,2]);
52      for i:=1 to n-1 do
53          for j:=i+1 to n do
54              begin
55                   inc(l);a[l,1]:=i;a[l,2]:=j;
56                   a[l,3]:=(b[i,1]-b[j,1])*(b[i,1]-b[j,1])+(b[i,2]-b[j,2])*(b[i,2]-b[j,2]);
57              end;
58      sort(1,l);
59      for i:=1 to n do c[i]:=i;
60      j:=0;mm:=0;
61      for i:=1 to n-1 do
62          begin
63               repeat
64                     inc(j);
65                     k:=getfat(a[j,1]);
66                     l:=getfat(a[j,2]);
67               until k<>l;
68               mm:=max(mm,a[j,3]);
69               c[k]:=l;
70          end;
71      l:=0;
72      for i:=1 to m do if (d[i]*d[i])>=mm then inc(L);
73      writeln(l);
74      readln;
75 end.

 

转载于:https://www.cnblogs.com/HansBug/p/4470737.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值