http://116.196.97.99/problem.php?cid=1001&pid=0
本题来自 Contest1001 - 邀请赛20180814
问题 A: SUM
时间限制: 1 Sec 内存限制: 128 MB
提交: 461 解决: 175
[提交] [状态] [讨论版] [命题人:admin]
题目描述
题面 PDF 下载链接 : https://pan.baidu.com/s/1pCgBVQLCp-ygwKgd708Uhw
![](http://116.196.97.99/upload/image/20180814/20180814114919_38758.jpg)
样例输入
5
3 2 9 2 2
样例输出
56 41 33 6 2
题解:这个题暴力做肯定超时(三层for循环),其实这是一道前缀和或后缀和递推的问题。
以后缀和加递推为例:通过公式可以算得g(n)=an,g(n-1)=2*a(n-1) + an =2*a(n-1) + g(n),g(n-2) = 3*a(n-2) + g(n-1)……
(同理,前缀和加递推道理一样,只不过前缀和加递推时是减去某个数组元素的倍数,而后缀和是加上某个数组元素的倍数)
AC代码(后缀和加递推)
#include<iostream> #include<cstdio> #include<cmath> using namespace std; #define N 100005 int main() { int n; long long int a[N],g[N]; cin >> n; for ( int i=1;i<=n;i++) { cin >>a[i]; } g[n] = a[n]; for ( int i=n-1;i>=1;i--) { g[i] = g[i+1]+(n-i+1)*a[i]; } for ( int i=1;i<=n;i++) { cout << g[i]<< " " ; } } /************************************************************** Problem: 1016 User: 2017012749 Language: C++ Result: 正确 Time:83 ms Memory:3460 kb ****************************************************************/ |