A -- 计算几何你瞎暴力
Time Limit:5s Memory Limit:256MByte
Submissions:1778Solved:350
DESCRIPTION
今天HHHH考完了期末考试,他在教学楼里闲逛,他看着教学楼里一间间的教室,于是开始思考:
如果从一个坐标为 (x1,y1,z1)(x1,y1,z1)的教室走到(x2,y2,z2)(x2,y2,z2)的距离为 |x1−x2|+|y1−y2|+|z1−z2||x1−x2|+|y1−y2|+|z1−z2|
那么有多少对教室之间的距离是不超过RR的呢?
INPUT
第一行是一个整数
T(1≤T≤10)T(1≤T≤10), 表示有
TT组数据接下来是
TT组数据,对于每组数据:第一行是两个整数
n,q(1≤n≤5×104,1≤q≤103)n,q(1≤n≤5×104,1≤q≤103), 表示有
nn间教室,
qq次询问.接下来是
nn行, 每行3个整数
xi,yi,zi(0≤xi,yi,zi≤10)xi,yi,zi(0≤xi,yi,zi≤10),表示这间教室的坐标.最后是
qq行,每行一个整数
R(0≤R≤109)R(0≤R≤109),意思见描述.
OUTPUT
对于每个询问
RR输出一行一个整数,表示有多少对教室满足题目所述的距离关系.
SAMPLE INPUT
13 30 0 01 1 11 1 1123
SAMPLE OUTPUT
113
HINT
对于样例,1号教室和2号教室之间的距离为3, 1号和3号之间的距离为3, 2号和3号之间的距离为0
思路:n的范围较大,不能作为穷举变量,可以考虑穷举坐标,坐标11^3约等于1500种可能;
时间复杂度:O(1500*1500)
代码:
#include <stdio.h>
#include <math.h>
#include <string.h>
struct Class{
int x,y,z;
}s[1500];//保存不同教室坐标
int T,a,b,c,R,n,q;
int cnt[1500];//存放教室坐标相同的个数
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&q);
int sum=0;
memset(cnt,0,sizeof(cnt));
int j;
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
//判断当前教室坐标与前面教室坐标是否有相同的
for(j=0;j<sum;j++)
{
if(s[j].x==a&&s[j].y==b&&s[j].z==c)//有相同时
{
cnt[j]++;//教室坐标相同加1
break;
}
}
//新教室坐标
if(j==sum)
{
s[j].x=a;
s[j].y=b;
s[j].z=c;
cnt[j]=1;//新教室坐标次数为1
sum++;
}
}
for(int k=0;k<q;k++)
{
scanf("%d",&R);
int ans=0;
for(int i=0;i<sum;i++)//计算相同教室坐标
ans+=(cnt[i]*(cnt[i]-1))/2;//距离为零时
for(int i=0;i<sum;i++)//计算不同教室坐标
for(int j=i+1;j<sum;j++)
if((fabs(s[i].x-s[j].x)+fabs(s[i].y-s[j].y)+fabs(s[i].z-s[j].z))<=R)
ans+=cnt[i]*cnt[j];
printf("%d\n",ans);
}
}
return 0;
}