PTA 乙級 1049 數列的片段和 (20分) C/C++ (更新OJ導致測試點2無法通過,已解決)
阿新 • • 發佈:2020-08-11
還是想了第一版的做法,暴力演算法,超時了
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 (inti = 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 }