【百度之星】初赛第二场:B网页聚类

时间限制:
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;
}


你可能感兴趣的:(百度,float)