思路:
直接考虑每个数被计算到的次数,乘上数本身,直接计算,而不按照题目所给的数组和方式计算。
#include<bits/stdc++.h>
using namespace std;
int main()
{
long int n;
float a[300001];
double total,sum=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
total=a[i]*(n-i+1)*i;
sum+=total;
}
printf("%3.2f",sum);
return 0;
}
似乎有一点问题 ,再找找还有哪有错。
把n改成double类型后,又多了两分。
找了好久没找到错误。
参考了柳神的博客,原来是double在运算过程中的损失,double会在运算过程中多上0.000000001,最终影响答案的正确性,应该改成long long型,到最后运算的时候再除掉多乘的部分。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
double temp;
long long int sum;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>temp;
sum+=(long long)(temp*1000)*(n-i+1)*i;;
}
printf("%.2f",sum/1000.0);
return 0;
}
终于好了。。。