1. 程式人生 > >BZOJ 2429: [HAOI2006]聰明的猴子 MST

BZOJ 2429: [HAOI2006]聰明的猴子 MST

OS con 喜歡 AC \n 建立 operator amp str

2429: [HAOI2006]聰明的猴子

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

思路:

  題意即是求出最大的最小間距, 發現可以弄一張圖做最小瓶頸生成樹, 直接上Kruscal就好。a[i] *= a[i] 是防止曼哈頓距離開根的時候失精。

代碼:

技術分享圖片
 1 #include <algorithm>
 2 #include <cmath>
 3 #include <cstdio>
 4 using namespace std;
 5 int fa[1200];
 6 struct edge {
 7     int s, t;
 8     int v;
 9     bool operator < (const edge x) const {
10         return v < x.v;
11     }
12 }e[1100000];
13 int cnt;
14 int maxn = 0; 15 int n, m; 16 int x[1200], y[1200]; 17 int a[600]; 18 int dist(int i, int j) { 19 return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); 20 } 21 int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);} 22 void kruscal() { 23 sort(e+1, e+cnt+1); 24 for(int i=1;i<=m;i++) fa[i]=i; 25 for(int i=1;i<=cnt;i++) { 26 int dx = find(e[i].s), dy = find(e[i].t); 27 if(dx!=dy) { 28 fa[dx] = dy; 29 maxn = e[i].v; 30 } 31 } 32 } 33 int main() { 34 scanf("%d", &n); 35 for(int i=1;i<=n;i++) scanf("%d" ,&a[i]), a[i]*=a[i]; 36 scanf("%d", &m); 37 for(int i=1;i<=m;i++) scanf("%d%d", &x[i], &y[i]); 38 for(int i=1;i<=m;i++) { 39 for(int j=i+1;j<=m;j++) { 40 e[++cnt].s = i; e[cnt].t = j; 41 e[cnt].v = dist(i, j); 42 } 43 } 44 kruscal(); 45 int ans = 0; 46 for(int i=1;i<=n;i++) if(a[i]>=maxn) ans++; 47 printf("%d\n", ans); 48 }
View Code

BZOJ 2429: [HAOI2006]聰明的猴子 MST