题解 UVA12575 【Sin Cos Problem】

· · 题解

高中数学必修四填空题*1

根据辅助角公式,有:

A\sin{x}\ +\ B \cos{x}=\sqrt{A^2+B^2}\sin{(x+\phi)}

其中:

\tan{\phi}=\frac{B}{A}

所以函数的最大值显然是 \sqrt{A^2+B^2}

至于取到最大值时的最小非负数 x 的值,我们应该从以下方面来分类讨论:

  1. A=0 时,函数为 f(x)=B\cos{x},当 B>=0x=0;当 B<0 时, x=\pi

  2. A,B\not=0 时,\phi=\arctan{\dfrac{B}{A}},又因为 g(x)=\sin{x}x=\dfrac{\pi}{2} 时取到最大值 1,所以 x\dfrac{\pi}{2}-\phi 时有最值。

然而因为 A,B 的符号可能取负,所以以上的 x 可能为函数取最小值时的自变量。所以只要对于这个函数值判断一下符号,若为负,则可以往后加半个周期 \dfrac{T}{2}=\pi 即可取到最大值。

题目要求 x 为最小非负数。若计算出 x 为负数,只要输出答案之前加上周期 2\pi 即可。

也不要求导,二分什么的吧 orz Karry5307

#include <cstdio>
#include <cmath>
#define eps 1e-14
typedef long long ll;
inline int rd(){
    int x=0,p=1;
    char a=getchar();
    while((a<48||a>57)&&a!='-')a=getchar();
    if(a=='-')p=-p,a=getchar();
    while(a>47&&a<58)x=(x<<1)+(x<<3)+(a&15),a=getchar();
    return x*p;
}
const long double pi=acos(-1.0);
int T;
long double a,b;
long double p,ans;
int main(){
    T=rd();
    while(T--){
        scanf("%Lf%Lf",&a,&b);
        if(a==0&&b==0){
            puts("0.00 0.00");
            continue;
        }
        if(!a){
            if(b>0)printf("%.2lf %.2Lf\n",0.00,1.0*b);
            else printf("%.2Lf %.2Lf\n",pi,-1.0*b);
            continue;
        }
        ans=sqrt(a*a+b*b);
        p=pi/2-atan(1.0*b/a);
        if(a*sin(p)+b*cos(p)<0)p+=pi;
        if(p<0)p+=pi*2;
        printf("%.2Lf %.2Lf\n",p,ans);
    }
    return 0;
}