您的位置:首页 > 其它

uvalive 3616

2015-08-07 20:15 337 查看
题意:给出了空间内的n颗星星的坐标,有m个望远镜,每个望远镜的初始观测点都是(0,0,0),给出每个望远镜的一个截面的圆心坐标和角度,问最多能看到多少个星星。

题解:可以想象出如果望远镜能观测到星星,那么望远镜中轴线和星星两个向量角度差不会超过望远镜本身的角度,所以直接计算角度差判断就可以了。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const double eps = 1e-9;
const double PI = acos(-1);
struct Point3 {
double x, y, z;
Point3(double x = 0, double y = 0, double z = 0):x(x), y(y), z(z) {}
};
typedef Point3 Vector3;

int dcmp(double x) {
if (fabs(x) < eps)
return 0;
return x < 0 ? -1 : 1;
}
Vector3 operator + (Vector3 A, Vector3 B) { return Vector3(A.x + B.x, A.y + B.y, A.z + B.z); }
Vector3 operator - (Vector3 A, Vector3 B) { return Vector3(A.x - B.x, A.y - B.y, A.z - B.z); }
Vector3 operator * (Vector3 A, double b) { return Vector3(A.x * b, A.y * b, A.z * b); }
Vector3 operator / (Vector3 A, double b) { return Vector3(A.x / b, A.y / b, A.z / b); }
double Dot (Vector3 A, Vector3 B) { return A.x * B.x + A.y * B.y + A.z * B.z; }
double Length(Vector3 A) { return sqrt(Dot(A, A)); }
double Angle(Vector3 A, Vector3 B) { return acos(Dot(A, B) / Length(A) / Length(B)); }

const int N = 505;
Point3 P
, T
;
int n, m;
double w
;

int main() {
while (scanf("%d", &n) == 1 && n) {
for (int i = 0; i < n; i++)
scanf("%lf%lf%lf", &P[i].x, &P[i].y, &P[i].z);
scanf("%d", &m);
for (int i = 0; i < m; i++)
scanf("%lf%lf%lf%lf", &T[i].x, &T[i].y, &T[i].z, &w[i]);
int res = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
double rad = Angle(P[i], T[j]);
if (dcmp(rad - w[j]) < 0) {
res++;
break;
}
}
printf("%d\n", res);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: