PTA 乙级 1049 数列的片段和 (20分) C/C++ (更新OJ导致测试点2无法通过,已解决)

 

 还是想了第一版的做法,暴力算法,超时了

 1 #include<iostream>
 2 #include<vector>
 3 
 4 using namespace std;
 5 
 6 int main() {
 7     double n = 0;
 8     double sum = 0.0;
 9     cin >> n;
10     vector<double> arr(n);
11     for (int i = 0; i < n; ++i) cin >> arr[i];
12     for (int i = 0; i < n; ++i) {                //从头开始,n层
13         for (int j = i; j < n; ++j) {            //每层有多少个数列
14             for (int k = i; k <= j; k++) {        //每个数列做累加
15                 sum += arr[k];
16             }
17         }
18     }
19     printf("%.2f", sum);
20     return 0;
21 }

 

 是的,不能遍历每一个数做累加了

然后找到了规律,通过n的大小,找到每个元素出现的次数即可

 1 #include<iostream>
 2 #include<vector>
 3 
 4 using namespace std;
 5 
 6 int main() {
 7     int n = 0;
 8     cin >> n;
 9     double num = 0.0, sum = 0.0;
10     for (int i = 1; i <= n; ++i) {
11         cin >> num;
12         sum += num * (n - i + 1) * i;
13     }
14     printf("%.2f", sum);
15     return 0;
16 }

但还是出问题了,测试点2无法通过

 

 怎么也找不出原因,从网上找答案,发现大部分的做法和我的差不多

后来发现是PTA更新了OJ系统,用double进行大量数据计算会导致精度损失,测试点2,正是105的情况,得将sum转换为long long且扩大1000倍,来多保存小数点后的位数(仅仅是多精确了三位就能AC了。。。,感觉后续还会改OJ的)

感谢两位博主

柳婼

Ruihan's Blog

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 int main() {
 6     int n = 0;
 7     cin >> n;
 8     double num = 0.0;
 9     long long sum = 0;
10     for (int i = 1; i <= n; ++i) {
11         cin >> num;
12         sum += (long long)(num * 1000) * (n - i + 1) * i;
13     }
14     printf("%.2f", sum / 1000.0);    
15     return 0;
16 }

 

posted @ 2020-08-11 19:20  上帝的绵羊  阅读(239)  评论(0编辑  收藏  举报