余弦定理的证明及其应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
余弦定理的证明及其应用
首先,我们根据向量的加法,得到等式a+b=ca=c-ba2=(c-
b)2a2=b2+c2-2·b·ca2=b2+c2-2|b|·|c|·cosA (向量的数量积)a2=b2+c2-2bc·cosA得证
其实余弦定理和勾股定理一样,都有很多种证明方法,但是最常用的还是这两种其实是我不会
余弦定理的应用
讲完了证明,我们来看看余弦定理的应用
洛谷p2625 豪华游轮
题目描述(这里不是向量…)有一条豪华游轮(其实就是条小木船),这种船可以执行4种指令:
right X : 其中X是一个1到719的整数,这个命令使得船顺时针转动X度。
left X : 其中X是一个1到719的整数,这个命令使得船逆时针转动X度。 forward X : 其中X是一个整数(1到1000),使得船向正前方前进X的距离。
backward X : 其中X是一个整数(1到1000),使得船向正后方前进X的距离。
随意的写出了n个命令,找出一个种排列命令的方法,使得船最终到达的位置距离起点尽可能的远。
输入输出格式输入格式:第一行一个整数n(1 <= n <= 50),表示给出的命令数。
接下来n行,每行表示一个命令。
输出格式:一个浮点数,它能走的最远距离,四舍五入到小数点后6位。
这道题我们看到之后很快就能够反映出来,这个地方需要做一个贪心
因为多次拐弯肯定比一次的要近,所以我们让forward走完,然后尽量转180度,然后把backward走完,这时候起点和终点之间的距离就是要算的答案了
那么我们怎么来算他能最多转多少度才能让这个度数和180度的差最小呢?我们可以运用背包的思想f[i][j]表示前i个转圈的指令,能不能转到j度,转移其实很简单,大概是这样的:
for(int i=1,i<=anglecnt;i++)for(int
j=0;j<=360;j++){if(f[i-1][j]){
f[i][j]=true;
f[i][(j+angle[i]+360)%360]=true;}}
那好了,我们现在知道了旋转角度,知道了两边的边长,那么我们就可以使用余弦定理了啊
printf("%.6lf\n",sqrt(a*a+b*b-
2*a*b*cos(degree*pi/180)));
这里运用的是弧度制,如果不理解的话可以上网去搜一搜
全代码大概是这样的
# include
include
_Rep(i,a,b) for(int i=a;i>=b;i--)usingnamespace
std;constint N=55;constdouble pi=3.;int
n,go,back,angle[N],a,b,degree=INT_MAX;bool
f[N][1005];char
s[N];intmain(){scanf("%d",&n);Rep(i,1,n){int
x;scanf("%s%d",s,&x);if(s[0]=='f') a+=x;if(s[0]=='b') b+=-x;if(s[0]=='l') angle[++angle[0]]=x;if(s[0]=='r') angle[++angle[0]]=-x;}
f[0][0]=true;Rep(i,1,angle[0])Rep(j,0,360){if(f[i -1][j]){
f[i][j]=true;
f[i][(j+angle[i]+360)%360]=true;}}Rep(i,0,360)if( f[angle[0]][i]) degree=min(degree,abs(180-
i));printf("%.6lf\n",sqrt(a*a+b*b-
2*a*b*cos(degree*pi/180)));return0;}