PAT 甲级 1104 Sum of Number Segments (20分)

题目链接:

https://pintia.cn/problem-sets/994805342720868352/problems/994805363914686464

思路:

1.我们用序号[0…n-1]来给这n个数标号,观察可以发现包含第i个数的连续段起点只能在0 ~ i,终点只能在i ~ n-1;因此包含序号i的数的连续段一共有(i+1)*(n-i)个;
2.如果用double存储、累加求和结果,会因为double的内存存储精度问题而产生失精的结果;解决方法是将数据放大一定的倍数从而改用long long类型存储;
3.经过尝试如果方法过大的倍数也会出错,博主先前放大了1e6倍,导致测试点02错误,改为放大1000倍后通过;

代码:

#include 

using namespace std;

int main() {
#ifdef MyTest
	freopen("Sakura.txt", "r", stdin);
#endif
	long long n, ans = 0;
	scanf("%lld", &n);
	for(long long i = 0; i < n; ++i) {
		double x;
		scanf("%lf", &x);
		ans += (n - i) * (i + 1) * (long long)(x * 1000ll);	
	}
	printf("%.2f", ans / 1000.0);
	return 0;	
}

你可能感兴趣的:(PAT,(Advanced,Level),Practice)