1. 程式人生 > 實用技巧 >PTA 乙級 1049 數列的片段和 (20分) C/C++ (更新OJ導致測試點2無法通過,已解決)

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 }