链接:
https://www.nowcoder.net/acm/contest/68/A
来源:牛客网
来源:牛客网
题目描述
我们定义一个圆 C 为以原点 (0, 0) 为中心的单位圆(半径为 1 的圆)。给定在 C 圆周上相异的两点
A, B。请问由 A 出发,沿着圆周走到 B,是顺时针走比较近,还是逆时针走比较近呢?
C 的圆周上的所有点都可以用 (cos(t), sin(t)) 来表示,其中 t 的物理意义为角度。也就是说,在圆 C 中,给定一角度 t 即可确定在圆周上的一点。在这题中,所有的角度皆以弧度制表示,另外,由于不同的t 值有机会对应到同一个圆周上的点,我们限制t 的范围为[-π,π )。
本题中,我们会用tA 以及tB 来代表点A 及点B,数学上,A = (cos(tA), sin(tA)), B = (cos( tB), sin(tB))。
输入描述:
输入的第一行有一个正整数T,代表接下来共有几组测试数据。
接下来的T行,每行有两个浮点数tA, tB,代表一组数据。
输出描述:
对于每组数据请输出一行,如顺时针比较近请输出“clockwise”,否则请输出“counterclockwise”。
示例1
输入
3 3.14 3.13 -3.14 -3.13 1.00 2.00
输出
clockwise counterclockwise counterclockwise
题意:很明显,判断是顺时针近,还是逆时针近。
思路:公式什么的不用考虑,每次给你的Ta和Tb就是角度,只不过数值是弧度,角度中0~180,对应弧度0~PI。
我分了两种情况:Ta和Tb同号时:此时两点必然都在X轴上方或下方,直接作差判断即可。Ta和Tb不同号时:此时必然一个在上方,一个在下方,首先将Ta和Tb的绝对值相加,得到一个夹角,用2*PI-(|Ta|+|Tb|)得到另一个夹角,比较这两个夹角大小即可判出答案。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
double a,b,l,r;
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
{
scanf("%lf%lf",&a,&b);
if((a>=0&&b>=0)||(a<=0&&b<=0))
{
if(a-b<0)printf("counterclockwise\n");
else printf("clockwise\n");
continue;
}
r=fabs(a)+fabs(b);
l=6.28318-r; //2*PI即6.28
if(r<l)
{
if(a>b)printf("clockwise\n");
else printf("counterclockwise\n");
}
else
{
if(a>b)printf("counterclockwise\n");
else printf("clockwise\n");
}
}
return 0;
}