有如下方程:A
i = (A
i-1 + A
i+1)/2 - C
i (i = 1, 2, 3, .... n).
若给出A 0, A n+1, 和 C 1, C 2, .....C n.
若给出A 0, A n+1, 和 C 1, C 2, .....C n.
请编程计算A 1 = ?
input
输入包括多个测试实例。
对于每个实例,首先是一个正整数n,(n <= 3000); 然后是2个数a 0, a n+1.接下来的n行每行有一个数ci(i = 1, ....n);输入以文件结束符结束。
output
对于每个测试实例,用一行输出所求得的a1(保留2位小数).
Sample input
1 50.00 25.00 10.00 2 50.00 25.00 10.00 20.00
Sample output
27.50 15.00
做题的思路:
首先,我们应该知道,我们现在知道的是A0和An+1,但是这道题奇怪的是,就如A1=(A0+A2)/2-C1这样子,我们总会有一个不知道的数字,我们想求解A2,却发现了A2=(A1+A3)/2-C2这样子的怪圈,不断的都会有新的未知数的参与,感觉我们要一直一直推推推推到整个式子的结束,才可以得到整个的答案。
我也有想过求什么特征方程。。。。。。但是我求不出来。。。。。。数学没学好。。。。。。我也不知道能不能求。。。。。。
于是我就顺着A1开始,推了一下
惊讶的发现!我可以整理出一条An+1的式子!
根据这个式子,我觉得编程来实现就是非常简单的一件事情了,比较困难的就是那个Ci求和的问题。
#include<iostream>
using namespace std;
int main()
{
int n = 0;
while (cin >> n)
{
double *a = new double[3];
double *c = new double[n + 1];
cin >> a[0] >> a[2];
for (int i = 1; i <= n; ++i)
cin >> c[i];
if (n == 1)
{
a[1]=(a[0] + a[2]) / 2 - c[1];
printf("%.2f", a[1]);
cout << endl;
continue;
}
else
{
double sum = 0;
for (int i = 1; i <= n; ++i)
{
sum += 2 * (n + 1 - i)*c[i];
}
a[1] = (a[2] - sum + n*a[0]) / (n + 1);
printf("%.2f", a[1]);
cout << endl;
}
delete[]a;
a = NULL;
delete[]c;
c = NULL;
}
}
一看,是没有问题的,然后。。。。。提交了之后,就会出现一个大大的
要么超时,要么压线进
这可不允许啊!问题出现在哪了呢。。。。。。
原因出现在了
cin在不关闭同步的情况下会比scanf效率低
很多
当我把所有的cin在没有关闭同步的情况下,换成了scanf后之后,效率是。。。。。。
这是真的太夸张了