余弦定理的证明及其应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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#

include# include# include# define Rep(i,a,b) for(int i=a;i<=b;i++)# define

_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;}

相关文档
最新文档