2018蓝桥杯模拟赛(一)G【math 递推】
2018-03-27 13:07
435 查看
对于一个含有 n+2 个元素的数列,A0,A1,⋯An,满足这样的递归公式
Ai=Ai−1+Ai+12Ai−1+Ai+12-C_i 1≤i≤n
现在我们知道 A0,An+1 和 C1,C2,⋯Cn。
现在请你帮忙计算 A1 的值。
第二行输入两个数 A0 和 An+1,接着是 n 个数据分别是 C1,C2,⋯Cn。所有的数据均是两位小数的浮点数。
[cpp] view plain copy print?<textarea readonly =“readonly” name=“code”>#include <stdio.h>
int n;
double a[1002]={0};
double c[1002]={0};
int i;
double f(int j)
{
double sum1;
sum1=n*a[0]+a[n+1];
//sum1/=(n+1);
double sum2=0;
double temp=2*n;
i=1;
do
{
double x;
//double x=temp/(n+1);
x=temp*c[i];
sum2+=x;
temp-=2;
i++;
}while(temp!=0);
printf(”%.2lf\n”,(sum1-sum2)/(n+1));
return 0;
}
int main()
{
scanf(”%d”,&n);
scanf(”%lf”,&a[0]);
scanf(”%lf”,&a[n+1]);
for(i=1;i<=n;i++)
{
scanf(”%lf”,&c[i]);
}
f(1);
return 0;
} </textarea>
我的递推公式:(n+1)*a1=n*a[0]+a[n+1]-(2*n)*c[1]-(2*n-2)*c[2]-……-(4)*c[n-1]-(2)*c
更优的解法:思路:根据公式可推得(不考虑C)
A2=2*A1-A0;
A3=2*A2-A1=3A1-2*A0;
A4=2*A3-A2=4*A1-3*A0;
可以看出A(n+1)中有n+1个A1。我们可以先将A1当成0,用递推推出A(n+1)。再用给出的A(n+1)的值减去推出的A(n+1)的值,就可以得到n+1个A1的值。
代码实现:[cpp]
bb9d
view plain copy print?<textarea readonly =“readonly” name= “code”>#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
double a[1005];
int main()
{
int n;
double an1,c;
cin>>n;
cin>>a[0]>>an1;
a[1]=0;//关键一步,假设为零递推下去
for(int i=2;i<=n+1;i++)
{
cin>>c;
a[i]=2*a[i-1]-a[i-2]+2*c;
}
printf(”%.2f\n”,(an1-a[n+1])/(n+1));
return 0;
} </textarea>
double a[1005];
int main()
{
int n;
double an1,c;
cin>>n;
cin>>a[0]>>an1;
a[1]=0;//关键一步,假设为零递推下去
for(int i=2;i<=n+1;i++)
{
cin>>c;
a[i]=2*a[i-1]-a[i-2]+2*c;
}
printf("%.2f\n",(an1-a[n+1])/(n+1));
return 0;
} </textarea>
方法三:递推公式 A(i+1)=2*Ai-A(i-1)+2*Ci
假设i=2和3 分别代入上式 一直化简 可以得到公式
An=n*A1-(n-1)A0+ 【求和( 2(n-i)Ci )】 ( i从1到n-1 )
代码实现:[cpp] view plain copy print?<textarea readonly =“readonly” name=“code”>#include <stdio.h>
int main(){
int n;
double c,a0,an1;
scanf(”%d”,&n);
scanf(”%lf %lf”,&a0,&an1);
double ans=0;
ans=an1+n*a0;
for(int i=1;i<=n;i++){
scanf(”%lf”,&c);
ans-=c(n-i+1)*2;
}
ans/=(n+1);
printf(”%.2lf\n”,ans);
return 0;
}
</textarea>
int main(){
int n;
double c,a0,an1;
scanf("%d",&n);
scanf("%lf %lf",&a0,&an1);
double ans=0;
}
</textarea>
总结:数|列的递归、通项公式的求解、代码实现
方程的思想:令A1=0,解得(x_n+1)的值,然后用题目已知的An1减去该值,得到最终答案。
Ai=Ai−1+Ai+12Ai−1+Ai+12-C_i 1≤i≤n
现在我们知道 A0,An+1 和 C1,C2,⋯Cn。
现在请你帮忙计算 A1 的值。
输入格式
第一行输入一个整数 n(1≤n≤1000)。第二行输入两个数 A0 和 An+1,接着是 n 个数据分别是 C1,C2,⋯Cn。所有的数据均是两位小数的浮点数。
输出格式
输出 A_1A1 的值,结果保留两位小数。样例输入1
1 50.50 25.50 10.15
样例输出1
27.85
样例输入2
2 -756.89 52.52 172.22 67.17
样例输出2
-761.49自己的代码:
[cpp] view plain copy print?<textarea readonly =“readonly” name=“code”>#include <stdio.h>
int n;
double a[1002]={0};
double c[1002]={0};
int i;
double f(int j)
{
double sum1;
sum1=n*a[0]+a[n+1];
//sum1/=(n+1);
double sum2=0;
double temp=2*n;
i=1;
do
{
double x;
//double x=temp/(n+1);
x=temp*c[i];
sum2+=x;
temp-=2;
i++;
}while(temp!=0);
printf(”%.2lf\n”,(sum1-sum2)/(n+1));
return 0;
}
int main()
{
scanf(”%d”,&n);
scanf(”%lf”,&a[0]);
scanf(”%lf”,&a[n+1]);
for(i=1;i<=n;i++)
{
scanf(”%lf”,&c[i]);
}
f(1);
return 0;
} </textarea>
<textarea readonly ="readonly" name="code">#include <stdio.h> int n; double a[1002]={0}; double c[1002]={0}; int i; double f(int j) { double sum1; sum1=n*a[0]+a[n+1]; //sum1/=(n+1); double sum2=0; double temp=2*n; i=1; do { double x; //double x=temp/(n+1); x=temp*c[i]; sum2+=x; temp-=2; i++; }while(temp!=0); printf("%.2lf\n",(sum1-sum2)/(n+1)); return 0; } int main() { scanf("%d",&n); scanf("%lf",&a[0]); scanf("%lf",&a[n+1]); for(i=1;i<=n;i++) { scanf("%lf",&c[i]); } f(1); return 0; } </textarea>
我的递推公式:(n+1)*a1=n*a[0]+a[n+1]-(2*n)*c[1]-(2*n-2)*c[2]-……-(4)*c[n-1]-(2)*c
更优的解法:思路:根据公式可推得(不考虑C)
A2=2*A1-A0;
A3=2*A2-A1=3A1-2*A0;
A4=2*A3-A2=4*A1-3*A0;
可以看出A(n+1)中有n+1个A1。我们可以先将A1当成0,用递推推出A(n+1)。再用给出的A(n+1)的值减去推出的A(n+1)的值,就可以得到n+1个A1的值。
代码实现:[cpp]
bb9d
view plain copy print?<textarea readonly =“readonly” name= “code”>#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
double a[1005];
int main()
{
int n;
double an1,c;
cin>>n;
cin>>a[0]>>an1;
a[1]=0;//关键一步,假设为零递推下去
for(int i=2;i<=n+1;i++)
{
cin>>c;
a[i]=2*a[i-1]-a[i-2]+2*c;
}
printf(”%.2f\n”,(an1-a[n+1])/(n+1));
return 0;
} </textarea>
<textarea readonly ="readonly" name= "code">#include <cstdio>
include <cstring>
include <algorithm>
include <iostream>
using namespace std;double a[1005];
int main()
{
int n;
double an1,c;
cin>>n;
cin>>a[0]>>an1;
a[1]=0;//关键一步,假设为零递推下去
for(int i=2;i<=n+1;i++)
{
cin>>c;
a[i]=2*a[i-1]-a[i-2]+2*c;
}
printf("%.2f\n",(an1-a[n+1])/(n+1));
return 0;
} </textarea>
方法三:递推公式 A(i+1)=2*Ai-A(i-1)+2*Ci
假设i=2和3 分别代入上式 一直化简 可以得到公式
An=n*A1-(n-1)A0+ 【求和( 2(n-i)Ci )】 ( i从1到n-1 )
代码实现:[cpp] view plain copy print?<textarea readonly =“readonly” name=“code”>#include <stdio.h>
int main(){
int n;
double c,a0,an1;
scanf(”%d”,&n);
scanf(”%lf %lf”,&a0,&an1);
double ans=0;
ans=an1+n*a0;
for(int i=1;i<=n;i++){
scanf(”%lf”,&c);
ans-=c(n-i+1)*2;
}
ans/=(n+1);
printf(”%.2lf\n”,ans);
return 0;
}
</textarea>
<textarea readonly ="readonly" name="code">#include <stdio.h>
int main(){
int n;
double c,a0,an1;
scanf("%d",&n);
scanf("%lf %lf",&a0,&an1);
double ans=0;
ans=an1+n*a0; for(int i=1;i<=n;i++){ scanf("%lf",&c); ans-=c*(n-i+1)*2; } ans/=(n+1); printf("%.2lf\n",ans); return 0;
}
</textarea>
总结:数|列的递归、通项公式的求解、代码实现
方程的思想:令A1=0,解得(x_n+1)的值,然后用题目已知的An1减去该值,得到最终答案。
相关文章推荐
- 2018 蓝桥杯省赛 A 组模拟赛 矩阵求和
- 2018 蓝桥杯省赛 A 组模拟赛 末尾零的个数
- 2018蓝桥杯模拟赛--快速幂
- 计蒜客 2018蓝桥杯省赛 B组模拟赛(一) A题 年龄(java)
- 2018 蓝桥杯省赛 A 组模拟赛 最强团队
- 2018蓝桥杯模拟赛(一)--青出于蓝而胜于蓝(线段树)
- 2018蓝桥杯模拟赛(一)C【模拟】D【dp】E【全排列】F【dfs】
- 计蒜客 2018蓝桥杯省赛 B组模拟赛(五) B题 素数个数(java)
- 计蒜客 2018蓝桥杯省赛 B组模拟赛(一)0 B题 开头灯(java)
- 2018 蓝桥杯省赛 A 组模拟赛 蒜头君的数轴
- 2018 蓝桥杯省赛 A 组模拟赛 划分整数
- 计蒜客 2018蓝桥杯省赛 B组模拟赛(一) D题 LIS(java)
- 2018 蓝桥杯省赛 A 组模拟赛 蒜头君下棋
- 2018蓝桥杯模拟赛(一)I【容斥原理】
- 2018 蓝桥杯省赛 B 组模拟赛(一)G. 数列求值(第一次见这种递推.)
- 蓝桥杯2018第五次模拟赛--素数的个数
- 计蒜客 2018蓝桥杯模拟赛(一)数独
- 计蒜客——2018蓝桥杯模拟赛(一)之天上的星星
- 2018 蓝桥杯省赛 A 组模拟赛 取石子
- G题 数列求值-Java_2018 蓝桥杯省赛B组模拟赛(一)