这个题目根本就不是一个编程题,硬说的话,当公务员考试的规律题还挺不错的。
首先,我是把它当编程题做的,暴力求解,结果后两个点超时。
然后,稍微优化了一下,修改成了二重循环,结果还是后面两个点超时。
我陷入了沉思,这个题果然有坑,我想肯定有规律。
于是我在草纸上列举了几个情况(为了方便就用1 2 3 4 5...代替了,题目中是不超过1的小数)。
第一个例子
输入
4
1 2 3 4
计算过程需要加的数字
1
1 2
1 2 3
1 2 3 4
2
2 3
2 3 4
3
3 4
4
第二个例子
输入
5
1 2 3 4 5
计算过程需要加的数字
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
2
2 3
2 3 4
2 3 4 5
3
3 4
3 4 5
4
4 5
5
第三个例子
输入
6
1 2 3 4 5 6
计算过程需要加的数字
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
2
2 3
2 3 4
2 3 4 5
2 3 4 5 6
3
3 4
3 4 5
3 4 5 6
4
4 5
4 5 6
5
5 6
6
写到这里,我终于发现了猫腻:
每个数字被加的次数其实等于
(总次数n - 当前元素下标)*(当前元素下标+1)
下标从0开始计算。
于是用一遍循环成功写出了程序。
结果一提交,测试点3答案错误。。。。。当时心里一万个草泥马跑过。
边界??0的问题??又调试了10分钟,就是想不出为什么错了。
于是实在受不了了,问了问度娘,一老哥说测试点3得用long double。然后我立马就改了数据类型,一提交,全过。此时心里又跑过了一万个草泥马。。。我太难了。
果然PAT最难的题是第一题,唉,太坑了。下面是曲折的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
using namespace std;
int main() {
//输入顺带计算
int n;
double val;
long double sum = 0.0;
scanf("%d",&n);
for (int i = 0; i < n; i++) {
scanf("%lf", &val);
sum += val * (n - i) * (i + 1);
}
//打印
printf("%.2llf",sum);
return 0;
}