2018蓝桥杯模拟赛(一)G【math 递推】

对于一个含有 n+2 个元素的数列,A0,A1,An,满足这样的递归公式


Ai= A i 1 + A i + 1 2 -C_i 1in


现在我们知道 A0,An+1 和 C1,C2,Cn

现在请你帮忙计算 A1 的值。

输入格式

第一行输入一个整数 n(1n1000)

第二行输入两个数 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
自己的代码:

  1. <textarea readonly =“readonly” name=“code”>#include <stdio.h>  
  2.     int n;  
  3.     double a[1002]={0};  
  4.     double c[1002]={0};  
  5.     int i;  
  6. double f(int j)  
  7. {  
  8.     double sum1;  
  9.     sum1=n*a[0]+a[n+1];  
  10.     //sum1/=(n+1);  
  11.     double sum2=0;  
  12.     double temp=2*n;  
  13.     i=1;  
  14.     do  
  15.     {  
  16.         double x;  
  17.         //double x=temp/(n+1);  
  18.         x=temp*c[i];  
  19.         sum2+=x;  
  20.         temp-=2;  
  21.         i++;  
  22.     }while(temp!=0);  
  23.      printf(”%.2lf\n”,(sum1-sum2)/(n+1));  
  24.      return 0;  
  25. }  
  26. int main()  
  27. {  
  28.     scanf(”%d”,&n);  
  29.     scanf(”%lf”,&a[0]);  
  30.     scanf(”%lf”,&a[n+1]);  
  31.     for(i=1;i<=n;i++)  
  32.     {  
  33.         scanf(”%lf”,&c[i]);  
  34.     }  
  35.       
  36.     f(1);  
  37.     return 0;  
  38.  } </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[n]

更优的解法:
思路:根据公式可推得(不考虑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的值。

代码实现:
  1. <textarea readonly =“readonly” name= “code”>#include <cstdio>  
  2. #include <cstring>  
  3. #include <algorithm>  
  4. #include <iostream>  
  5. using namespace std;  
  6. double a[1005];  
  7. int main()  
  8. {  
  9.     int n;  
  10.     double an1,c;  
  11.     cin>>n;  
  12.     cin>>a[0]>>an1;  
  13.     a[1]=0;//关键一步,假设为零递推下去  
  14.     for(int i=2;i<=n+1;i++)  
  15.     {  
  16.         cin>>c;  
  17.         a[i]=2*a[i-1]-a[i-2]+2*c;  
  18.     }  
  19.     printf(”%.2f\n”,(an1-a[n+1])/(n+1));   
  20.     return 0;  
  21.  } </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 )

代码实现:
  1. <textarea readonly =“readonly” name=“code”>#include <stdio.h>  
  2.    
  3. int main(){  
  4.     int n;  
  5.     double c,a0,an1;  
  6.     scanf(”%d”,&n);  
  7.     scanf(”%lf %lf”,&a0,&an1);  
  8.     double ans=0;  
  9.    
  10.     ans=an1+n*a0;  
  11.     for(int i=1;i<=n;i++){  
  12.         scanf(”%lf”,&c);  
  13.         ans-=c(n-i+1)*2;  
  14.     }  
  15.     ans/=(n+1);  
  16.     printf(”%.2lf\n”,ans);  
  17.     return 0;  
  18. }  
  19. </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&lt;=n;i++){
    scanf("%lf",&amp;c);
    ans-=c*(n-i+1)*2;
}
ans/=(n+1);
printf("%.2lf\n",ans);
return 0;

}
</textarea>


总结:数|列的递归、通项公式的求解、代码实现
方程的思想:令A1=0,解得(x_n+1)的值,然后用题目已知的An1减去该值,得到最终答案。


对于一个含有 n+2 个元素的数列,A0,A1,An,满足这样的递归公式


Ai= A i 1 + A i + 1 2 -C_i 1in


现在我们知道 A0,An+1 和 C1,C2,Cn

现在请你帮忙计算 A1 的值。

输入格式

第一行输入一个整数 n(1n1000)

第二行输入两个数 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
自己的代码:

  1. <textarea readonly =“readonly” name=“code”>#include <stdio.h>  
  2.     int n;  
  3.     double a[1002]={0};  
  4.     double c[1002]={0};  
  5.     int i;  
  6. double f(int j)  
  7. {  
  8.     double sum1;  
  9.     sum1=n*a[0]+a[n+1];  
  10.     //sum1/=(n+1);  
  11.     double sum2=0;  
  12.     double temp=2*n;  
  13.     i=1;  
  14.     do  
  15.     {  
  16.         double x;  
  17.         //double x=temp/(n+1);  
  18.         x=temp*c[i];  
  19.         sum2+=x;  
  20.         temp-=2;  
  21.         i++;  
  22.     }while(temp!=0);  
  23.      printf(”%.2lf\n”,(sum1-sum2)/(n+1));  
  24.      return 0;  
  25. }  
  26. int main()  
  27. {  
  28.     scanf(”%d”,&n);  
  29.     scanf(”%lf”,&a[0]);  
  30.     scanf(”%lf”,&a[n+1]);  
  31.     for(i=1;i<=n;i++)  
  32.     {  
  33.         scanf(”%lf”,&c[i]);  
  34.     }  
  35.       
  36.     f(1);  
  37.     return 0;  
  38.  } </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[n]

更优的解法:
思路:根据公式可推得(不考虑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的值。

代码实现:
  1. <textarea readonly =“readonly” name= “code”>#include <cstdio>  
  2. #include <cstring>  
  3. #include <algorithm>  
  4. #include <iostream>  
  5. using namespace std;  
  6. double a[1005];  
  7. int main()  
  8. {  
  9.     int n;  
  10.     double an1,c;  
  11.     cin>>n;  
  12.     cin>>a[0]>>an1;  
  13.     a[1]=0;//关键一步,假设为零递推下去  
  14.     for(int i=2;i<=n+1;i++)  
  15.     {  
  16.         cin>>c;  
  17.         a[i]=2*a[i-1]-a[i-2]+2*c;  
  18.     }  
  19.     printf(”%.2f\n”,(an1-a[n+1])/(n+1));   
  20.     return 0;  
  21.  } </textarea>  
<textarea readonly ="readonly" name= "code">#include <cstdio>




猜你喜欢

转载自blog.csdn.net/weixin_38293125/article/details/79711513