一艘飞船,舰载大炮可以摧毁位于雷达坐标轴整点处(两坐标均为整数)的目标,坐标轴原点可以移动一次,求最多摧毁目标,如果有多种情况求原点移动距离较小的那一个
题目说坐标只有3位小数,且将坐标变成整数只需考虑小数部分,因此用a[1000][1000]的数组记录移动x,y后有多少个点移到了整数点上,由于x和y各有加和减两种情况,因此一个点有四种情况+1,为了方便区别将加处理+1000,开a[2000][2000]。计算时对1000取余。
#include <iostream>
#include <cstring>
#include <queue>
#include <cmath>
#include <cstdio>
#include <algorithm>
#define eps 1e-7
using namespace std;
int a[2200][2200];
int dis(int a,int b)
{
return a*a+b*b;
}
int main()
{
int n;
double x,y;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&x,&y);
int x1;
x1=floor(x*1000+eps);
int y1;
y1=floor(y*1000+eps);
int x2,y2;
int x3,y3;
x2=x1%1000;
y2=y1%1000;
if(x2<0)
{
x2+=1000;
}
x3=1000-x2;
y2=y1%1000;
if(y2<0)
{
y2+=1000;
}
y3=1000-y2;
a[x2][y2]++;
a[x2][y3+1000]++;
a[x3+1000][y2]++;
a[x3+1000][y3+1000]++;
}
int ans=0;
int p,q;
for(int i=0;i<1999;i++)
{
for(int j=0;j<1999;j++)
{
if(ans<a[i][j]||(ans==a[i][j]&&dis(p%1000,q%1000)>dis(i%1000,j%1000)))
{
ans=a[i][j];
p=i;
q=j;
}
}
}
printf("%d ",ans);
//printf("%d %d",p,q);
printf("%.9lf\n",sqrt(dis(p%1000,q%1000))/1000.0);
}
return 0;
}