解题思路:
************************************************************************************************
按题目模拟会TLE①②;
加法->加法
减法->取反,加法
乘法->移位,逻辑判断,累加
除法->移位(试错),逻辑判断,累减
具体原理数电里有提到,尽量避免运算复杂,耗时的步骤。
①ans= a1 · a2 + a1 · a3 + · · · + a1 · an + a2 · a3 + · · · + an-2 · an-1 + an-2 · an + an-1 · an.
②=>ans=a1+a2*a1+a3*a2*a1+a4*a3*a2*a1+...+an*an-1*...a3*a2*a1;(累乘再求和)
③=>ans=a1*(a2+a3+a4...+an-1+an)+a2*(a3+a4+a5..+an-1+an)+....an-1*(an);(前缀和相乘再求和)
③简化了运算过程,化大量的乘法运算为加法运算(即:前缀和),以避免TLE;
参考代码:
③--------AC
#include <iostream> using namespace std; long long arr[200005]; int main() { int n; long long ans=0,sum=0; scanf("%lld",&n); for(int i=0;i<n;i++) { scanf("%lld",&arr[i]); sum+=arr[i]; } for(int i=0;i<n;i++) { sum-=arr[i];//减去当前即为前缀和 ans+=arr[i]*sum; } printf("%lld",ans); return 0; }
②--------73分(其余样例TLE)
#include <iostream> using namespace std; long long arr[200005]; int main() { int n; long long ans=0; scanf("%lld",&n); for(int i=0;i<n;i++) { scanf("%lld",&arr[i]); for(int j=0;j<i;j++)//乘上之前的 { ans+=arr[i]*arr[j]; } } printf("%lld",ans); return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复