HDOJ 1140 War on Weather
题目
分类
几何
题意
卫星要 改变 地球上的气压 影响天气
卫星 在地球上至少 50 km
气压不稳定点在地球表面
求 在卫星范围内的气压点 数量
题解
先看这个图
![]()
我们只要计算出 dt 绿色地带为范围内 此区域的点距离都小于 dt
那么看 dt 如何求
由于 视线与地球相切 所以 dt = 卫星到球心的距离 - R(地球半径)
逐个求出 dt
遍历每个气压点即可
代码
#include <iostream>
#include <cmath>
#define maxn 100
const double PI = 3.14159265358979323846;
const double ER = 20000.0 / PI;
using namespace std;
double stlt[maxn][3];
double slr[maxn];
double dist(double x,double y,double z,double r);
double dist(double x,double y,double z);
int main()
{
int k,m,res;
double dt,x,y,z;
while(cin >> k >> m && k && m)
{
res = 0;
for(int i = 0;i < k;i++)
{
cin >> stlt[i][0] >> stlt[i][1] >> stlt[i][2];
slr[i] = dist(stlt[i][0],stlt[i][1],stlt[i][2],ER);
}
for(int i = 0;i < m;i++)
{
cin >> x >> y >> z;
for(int j = 0;j < k;j++)
{
dt = dist(stlt[j][0] - x,stlt[j][1] - y,stlt[j][2] - z);
if(slr[j] >= dt)
{
res++;
break;
}
}
}
cout << res << endl;
}
return 0;
}
double dist(double x,double y,double z,double r)
{
return sqrt(x*x + y*y + z*z - r*r);
}
double dist(double x,double y,double z)
{
return sqrt(x*x + y*y + z*z);
}