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的)
感谢两位博主
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 }
默默地一点点变强,细节决定成败