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