-
时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
有N(N <= 1000)个网页,
我们想按照它们的相似度或差异度,把它们聚成K(2 <= K <= N)个类。每个网页都具有一些属性, 简单起见我们认为每个网页只有三个属性:x、y、z。 归一化之后,这三个属性的取值范围都是[0,1]。两个网页i、 j的差异度如下定义:s(i,j) = (x_j-x_i)^2 + (y_j-y_i)^2 + (z_j-z_i)^2。请求出最大的t, 每个类至少包含一个网页,并且其中任意两个位于不同类中的网页的差异度都至少为t。
输入
- 第一行包含两个整数N和K,后面N行每行三个实数,分别为x、y、z 输出
- 最大的t的值,使用四舍五入在小数点后保留六位小数。 样例输入
-
5 30.1 0.2 0.40.2 0.8 0.70.3 0.4 0.50.0 0.5 0.00.3 0.3 0.2
样例输出
-
0.170000
#include <iostream>
#include <cmath>
#include "stdio.h"
int N,K=3;
float a[1000][3];
float difference(int i,int j)
{
float sum=0;
for(int k=0;k<K;++k)
sum+=pow(a[i][k]-a[j][k],2);
return sum;
}
float abss(float a)
{
if(a> 0)
return a;
else
return -a;
}
int dif(int i,int j,float M)
{
for(int k=0;k<K;++k)
{
if(abss(a[i][k]-a[j][k]) < M)
return 0;
}
return 1;
}
int main()
{
int i,j;
float data;
scanf("%d",&N);
scanf("%d",&K);
float b[5][3]={
{0.1,0.2,0.4},{0.2,0.8,0.7},{0.3,0.4,0.5},{0.0,0.5,0.0},{0.3,0.3,0.2}
};
for(i=0;i<N;++i)
{
for(j=0;j<K;++j)
{
scanf("%f",&data);
a[i][j]=data;
}
}
float min=1;
for(i=0;i<N;++i)
{
for(j=i+1;j<N;++j)
{
if(dif(i,j,difference(i,j)))
{
min=difference(i,j);
}
}
}
printf("%.6f",min);
return 0;
}