PAT_B_1049_C++(20分)
一看見有下面這個就不簡單
Java直接原地超時,上StreamTokenizer也不行,就不貼上來了,然后。。。
全網的題解沒有一個能AC的🤪🤪🤪
最后還是看了柳神的更新,找到了數據更新點
解題思路:
將數列中的每個數字讀取到temp中,假設我們選取的片段中包括temp,且這個片段的首尾指針分別為p和q,那么對于p,有i種選擇,即12…i,對于q,有n-i+1種選擇,即i, i+1, … n,所以p和q組合形成的首尾片段有 i * (n-i+1)種,因為每個里面都會出現temp,所以temp引起的總和為temp * i * (n – i + 1);遍歷完所有數字,將每個temp引起的總和都累加到sum中,最后輸出sum的值
數據更新
N比較大時,double類型的值多次累加導致的精度誤差,因為輸入為十進制小數,存儲到double中時,計算機內部使用二進制表示,且計算機的字長有限,有的十進制浮點數使用二進制無法精確表示只能無限接近,在字長的限制下不可避免會產生舍入誤差,這些細微的誤差在N較大時多次累加會產生較大誤差,所以建議不要使用double類型進行多次累加的精確計算,而是轉為能夠精確存儲的整型。嘗試把輸入的double類型的值擴大1000倍后轉為long long整型累加,同時使用long long類型保存sum的值,輸出時除以1000.0轉為浮點型再輸出(相當于把小數點向后移動3位后再計算,避免double類型的小數部分存儲不精確,多次累加后對結果產生影響)
但是也有問題,因為測試用例的不同小數點的位數不一樣,我在一天的兩個時段分別測試了5遍:中午第三個測試點依舊過不了,晚上六點半左右就一直都能過,所以代碼還有不成熟的地方,每次4個測試用例都需要知道是幾分位的小數,所以這是個撞大運的代碼,如果為了AC多提交幾次就夠了
總結
以上是生活随笔為你收集整理的PAT_B_1049_C++(20分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么用Fluentd进行简单流处理
- 下一篇: 京东自营靠谱吗