1. 程式人生 > >1821: [JSOI2010]Group 部落劃分 Group

1821: [JSOI2010]Group 部落劃分 Group

dash inline getch www. cnblogs 幫助 部落劃分 ble play

1821: [JSOI2010]Group 部落劃分 Group

Description

聰聰研究發現,荒島野人總是過著群居的生活,但是,並不是整個荒島上的所有野人都屬於同一個部落,野人們總是拉幫結派形成屬於自己的部落,不同的部落之間則經常發生爭鬥。只是,這一切都成為謎團了——聰聰根本就不知道部落究竟是如何分布的。 不過好消息是,聰聰得到了一份荒島的地圖。地圖上標註了N個野人居住的地點(可以看作是平面上的坐標)。我們知道,同一個部落的野人總是生活在附近。我們把兩個部落的距離,定義為部落中距離最近的那兩個居住點的距離。聰聰還獲得了一個有意義的信息——這些野人總共被分為了K個部落!這真是個好消息。聰聰希望從這些信息裏挖掘出所有部落的詳細信息。他正在嘗試這樣一種算法: 對於任意一種部落劃分的方法,都能夠求出兩個部落之間的距離,聰聰希望求出一種部落劃分的方法,使靠得最近的兩個部落盡可能遠離。 例如,下面的左圖表示了一個好的劃分,而右圖則不是。請你編程幫助聰聰解決這個難題。 技術分享

Input

第一行包含兩個整數N和K(1< = N < = 1000,1< K < = N),分別代表了野人居住點的數量和部落的數量。 接下來N行,每行包含兩個正整數x,y,描述了一個居住點的坐標(0 < =x, y < =10000)

Output

輸出一行,為最優劃分時,最近的兩個部落的距離,精確到小數點後兩位。

Sample Input

4 2
0 0
0 1
1 1
1 0


Sample Output

1.00

HINT

Source

JSOI2010第二輪Contest1

貪心處理 按照兩點之間距離從小到大排序 每次合並兩個相距最小的 並且 n-- 知道減到k個部落 技術分享
 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cctype>
 4 #include <cstring>
 5 #include <algorithm>
 6 
 7 using namespace std;
 8 
 9 const int MAXN=1010;
10 
11 int n,k,cnt,tot;
12 
13 int x[MAXN],y[MAXN],fa[MAXN];
14 
15 struct node {
16     int
x,y; 17 double dis; 18 bool operator < (const node&a) const { 19 return dis<a.dis; 20 } 21 }; 22 node e[MAXN*MAXN]; 23 24 inline void read(int&x) { 25 int f=1;register char c=getchar(); 26 for(x=0;!isdigit(c);c==-&&(f=-1),c=getchar()); 27 for(;isdigit(c);x=x*10+c-48,c=getchar()); 28 x=x*f; 29 } 30 31 inline double c(int i,int j) { 32 return sqrt((double)(x[i]-x[j])*(x[i]-x[j])+(double)(y[i]-y[j])*(y[i]-y[j])); 33 } 34 35 inline int find(int x) { 36 if(x==fa[x]) return x; 37 return fa[x]=find(fa[x]); 38 } 39 40 int hh() { 41 // freopen("people.in","r",stdin); 42 // freopen("people.out","w",stdout); 43 read(n);read(k); 44 for(int i=1;i<=n;++i) read(x[i]),read(y[i]),fa[i]=i; 45 for(int i=1;i<=n;++i) 46 for(int j=i+1;j<=n;++j) { 47 e[++cnt].x=i; 48 e[cnt].y=j; 49 e[cnt].dis=c(i,j); 50 } 51 sort(e+1,e+1+cnt); 52 n=n-k+1; 53 for(int i=1;i<=cnt;++i) { 54 int xx=find(e[i].x); 55 int yy=find(e[i].y); 56 if(xx!=yy) { 57 fa[xx]=yy; 58 ++tot; 59 if(tot==n) { 60 printf("%.2lf\n",e[i].dis); 61 goto END; 62 } 63 } 64 } 65 END: 66 return 0; 67 } 68 69 int sb=hh(); 70 int main(int argc,char**argv) {;}
代碼

1821: [JSOI2010]Group 部落劃分 Group