博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Simple calculations
阅读量:6924 次
发布时间:2019-06-27

本文共 1466 字,大约阅读时间需要 4 分钟。

Description
有一个包括n+2个元素的数列a0, a1, ..., an+1 (n <= 3000, -1000 <= ai <=1000)。它们之间满足ai = (ai-1 + ai+1)/2 - ci (i=1, 2, ..., n)。如今给出a0, an+1, c1, ... , cn.。请编敲代码计算出a1。

Input
输入的第一行是一个整数n。

接下去的两行各自是a0和an+1,(精确到小数点后两位)再接下去的n行是ci(精确到小数点后两位)。每一个数字占一行。


Output
输出a1 ,其格式与 a0 同样。

Sample Input
1
50.50
25.50
10.15

Sample Output
27.85

 

解题思路:

一開始想用递归来求,但是数据挺大的,n<=3000,所以便想找找当中的规律,看看能不能列出一个算式让a[1]用a[0],a[n+1]和c[1~n]来表示。

首先能够列出下面算式:
2 * a[1] = a[0] + a[2] - 2 * c[1]
2 * a[2] = a[1] + a[3] - 2 * c[2]
......
2 * a[n] = a[n-1] + a[n+1] - 2 * c[n]
等式两边分别相加可得:
2 * (a[1] + ... + a[n]) = (a[0] + ... + a[n-1]) + (a[2] + ... + a[n+1]) - 2 * (c[1] + ... + c[n])
移项后得:
a[1] + a[n] = a[0] + a[n+1] - 2 * (c[1] + ... + c[n])
让下标n从1~n,列出以上算式:
a[1] + a[1] = a[0] + a[2]
 - 2 * c[1]

a[1] + a[2] = a[0] + a[3] - 2 * (c[1] + c[2])

a[1] + a[n] = a[0] + a[n+1] - 2 * (c[1] + ... + c[n])

等式两边分别相加后得:
(n + 1) * a[1] = n * a[0] + a[n+1] - 2 * (c[1] + (c[1] + c[2]) + ... + (c[1] + c[2] + ... +c[n])) 
AC代码:
#include
#define MAX_NUM 3005int main(){ double a[MAX_NUM], c[MAX_NUM]; int n; scanf("%d", &n); scanf("%lf%lf", &a[0], &a[n+1]); for(int i = 1; i <= n; i++) scanf("%lf", &c[i]); int j = 1; double sum_1 = 0, sum_2 = 0; for(int i = 1; i <= n ; i++) { for(; j <= i; j++) { sum_1 += c[j]; } sum_2 += sum_1; } a[1] = (n * a[0] + a[n + 1] - 2 * sum_2) / (n + 1); printf("%.2lf\n", a[1]); return 0;}

转载地址:http://wwecl.baihongyu.com/

你可能感兴趣的文章
vba获取最后一行一列,复制粘贴特定一列的值
查看>>
精美案例展示:立体动感的视差滚动效果网站作品!
查看>>
我的友情链接
查看>>
Netty 100万级高并发服务器配置
查看>>
我的友情链接
查看>>
Jmeter如何实现参数化用户,并且管理Cookie
查看>>
spring依赖注入IOC原理
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
IntelliJ IDEA15优化设置
查看>>
用 mapreduce 怎么处理数据倾斜问题?
查看>>
maven+eclipse+tomcat配置
查看>>
STL容器,外加一些小细节;我是个小菜鸡
查看>>
[转载] 中华典故故事(孙刚)——40 不见棺材不落泪,不到黄河不死心
查看>>
extjs4 设置第一个datefield值小于第二个
查看>>
算法导论第四章
查看>>
拆笔记本
查看>>
STP的作用
查看>>
浅谈正则表达式
查看>>
win7下安装linux操作系统,实现双系统
查看>>