标签:时间优化,无符号长整型
时间限制: 3s
时间限制:C语言 1s,C++ 1s,其它语言3s
内存限制: 320MB 提交: 15813 解决: 3749
一、题目描述
给定 n 个整数 a1, a2, · · · , an ,求它们两两相乘再相加的和,即 S = a1 · a2 + a1 · a3 + · · · + a1 · an + a2 · a3 + · · · + an-2 · an-1 + an-2 · an + an-1 · an.
二、输入格式
输入的第一行包含一个整数 n 。
第二行包含 n 个整数 a1, a2, · · · an。
三、输出格式
输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。
四、样例输入
4 1 3 6 9
五、样例输出
117
六、提示
对于 30% 的数据,1 ≤ n ≤ 1000,1 ≤ ai ≤ 100。
对于所有评测用例,1 ≤ n ≤ 200000,1 ≤ ai ≤ 1000。
七、解题思路
刚开始想到的就是暴力解法,根据题目里面描述的算式,全部用for循环一个个实现,而且用的是整型数据类型,在求和的时候自然会越界,在计算量大时也会超时。
下面是我的初始解法代码,只通过了两个测试点,行不通行不通,大家别学我!!QAQ
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[n];//储存原始数据
int sum[n]={0};//储存和数据
int res=0;//最终结果
for(int i=0;i<n;i++)
{
cin >> a[i];
}
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
sum[i]+=a[i]*a[j];
}
res+=sum[i];
}
cout << res;
return 0;
}
后面参考了一位大佬的解题思路,先将计算化简以防超时,我们把公因子提出来,就可以得到计算表达式为s=a1*(a2+a3+...+an)+a2*(a3+a4+...+an)+...+an-1*an。(在下面的代码中我实现的数组下标是从0开始到n-1)那我们可以用tmp先存储a2+a3+...+an,在后面的计算中逐步减去最前面的元素值即可;对于越界问题,元素个数n以及元素值啊a[i]属于int范围,而结果s已经tmp则会超出int范围,用无符号长整型unsigned long long 来存储。上代码!
#include<iostream>
using namespace std;
unsigned long long tmp=0;//无符号长整型
int main()
{
int n;
unsigned long long s=0;//储存最终结果
cin >> n;
int a[n];
for(int i=0;i<n;i++)
{
cin >> a[i];
}
for(int i=1;i<n;i++)
{
tmp+=a[i];
}
for(int i=0;i<n;i++)
{
s+=a[i]*tmp;
tmp-=a[i+1];
}
cout << s;
return 0;
}