首页 > 代码库 > BNUOJ34977夜空中最亮的星(数学,向量的应用)
BNUOJ34977夜空中最亮的星(数学,向量的应用)
夜空中最亮的星
2000ms
65536KB
64-bit integer IO format: %lld Java class name: Main
Font Size:
想要在陌生的地方不迷路,分清楚方向是很重要的,看星星就是一个很好的辅助方法。在一段时间内每晚的同一时间,天上星星的排布是几乎不变的。每颗星星的亮暗程度都有一个标识,称为星等,用一个实数来表示。这个实数的值越小,代表星星越亮,在灯光明亮的城市中能看到的星星的星等范围为 - ~ 3.5等左右。
Map同学害怕丢掉Map这个称号,每晚都勤劳地记下当天帝都星星的排布情况。他面向正北方向站立,将看到的天空映射到一张巨大的直角坐标系上,那么每颗星星都拥有了一个坐标。
这天Map同学来到了美丽的哈尔滨,抬头看见了最亮的星星木星和第二亮的北河三。他朝向他以为的北方站立,像在帝都一样地计算出它们的坐标。但实际上他并不是总能凭直觉找到北的。而且对于使用的坐标系的刻度的大小也没有办法把握。
那么现在他想知道,最少需要转多少角度,他才能够面向正北。
Input
第一行为数据组数t(t<=1000)。
接下来,对每组数据:
第一行为n(2<=n<=1000),表示前一天在帝都看到的星星的数量。
以下为n行,每行3个实数,分别为n颗星星的坐标和星等。
最后一行为4个实数,分别为木星和北河三的坐标。
以上实数绝对值不超过1000。π取3.14159265358。
Output
输出一行,为所需要转的最小角度,保留3位小数。
Sample Input
1 2 0 0 -2 1 0 0 0 0 0 1.2
Sample Output
90.000
Source
第十二届北京师范大学程序设计竞赛决赛
#include<stdio.h> #include<math.h> #define PI 3.14159265358 typedef struct nnn { double x,y,d; }node; int main() { int t,n; double s,jd,x,y,dis[2]; node star[2],st[2],xl[2]; scanf("%d",&t); while(t--) { scanf("%d",&n); jd=10000; star[0].d=star[1].d=10000; for(int i=0;i<n;i++) { scanf("%lf%lf%lf",&x,&y,&s); if(s<star[0].d) { star[1].x=star[0].x; star[1].y=star[0].y; star[1].d=star[0].d; star[0].x=x; star[0].y=y; star[0].d=s; } else if(s<star[1].d) { star[1].x=x; star[1].y=y; star[1].d=s; } } for(int i=0;i<2;i++) scanf("%lf%lf",&st[i].x,&st[i].y); xl[0].x=star[0].x-star[1].x; xl[0].y=star[0].y-star[1].y; dis[0]=sqrt(xl[0].x*xl[0].x+xl[0].y*xl[0].y); xl[1].x=st[0].x-st[1].x; xl[1].y=st[0].y-st[1].y; dis[1]=sqrt(xl[1].x*xl[1].x+xl[1].y*xl[1].y); jd=180.0/PI*acos((xl[0].x*xl[1].x+xl[0].y*xl[1].y)/(dis[0]*dis[1])); if(jd>180)jd=360-jd; printf("%.3lf\n",jd); } }
BNUOJ34977夜空中最亮的星(数学,向量的应用)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。