posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          URAL 1011

          Posted on 2008-04-23 22:44 ZelluX 閱讀(822) 評論(10)  編輯  收藏 所屬分類: Algorithm

          Problem

          Every bus in the Ekaterinburg city has a special man (or woman) called conductor. When you ride the bus, you have to give money to the conductor. We know that there are more then P% conductors and less then Q% conductors. Your task is to determine a minimal possible number of Ekaterinburg citizens.


          我只能說太挫了。。。精度問題搞了半天,看來浮點還是要盡量化成整型再算啊。


          還有個問題就是q*i是開區(qū)間還是閉區(qū)間,總之Wrong Answer了無數(shù)次后總算過了。。。

          評論

          # re: URAL 1011  回復(fù)  更多評論   

          2008-04-24 19:22 by luohandsome
          double也不行么

          # re: URAL 1011  回復(fù)  更多評論   

          2008-04-24 20:53 by ZelluX
          一開始用的是double,別人可以過,不過我搞不定,還是用整型了

          # re: URAL 1011[未登錄]  回復(fù)  更多評論   

          2008-05-02 20:24 by dave
          請教一下:
          既然dp, dq只有兩位小數(shù),那么
          int p = floor(dp * 100 + 0.5);

          int p = dp * 100;
          有區(qū)別嗎?

          # re: URAL 1011  回復(fù)  更多評論   

          2008-05-03 09:03 by ZelluX
          @dave
          當(dāng)然有,實際保存的時候是浮點啊,如果是dp = 49.9999999這種情況呢?

          # re: URAL 1011[未登錄]  回復(fù)  更多評論   

          2008-05-03 13:18 by dave
          謝謝。
          那為什么要四舍五入呢?即int p = floor(dp * 100 + 0.5);中的"+0.5"?

          # re: URAL 1011  回復(fù)  更多評論   

          2008-05-03 17:33 by ZelluX
          @dave
          49.99999999這種情況不四舍五入不是就錯了嗎。。。

          # re: URAL 1011[未登錄]  回復(fù)  更多評論   

          2008-05-04 10:36 by dave
          我把“Numbers are given with 2 digits precision”理解為輸入時即保證dp只有兩位小數(shù)的,因此我開始認為int p = dp * 100;就可以了(因為dp * 100是正整數(shù))。然而,實際的情況是:輸入為double(小數(shù)點后6或7位),但程序只保存兩位,因此需要四舍五入?但舍入誤差會不會造成在某些輸入數(shù)據(jù)下求得的i不是最小的滿足條件的值(只不過原題測試數(shù)據(jù)較弱)?
          如果這次理解仍然有誤,請你稍微詳細解釋下。比如“49.99999999這種情況不四舍五入不是就錯了嗎”?

          這一題看似簡單,但的確煩人。打擾你了。謝謝。

          # re: URAL 1011  回復(fù)  更多評論   

          2008-05-04 11:44 by ZelluX
          @dave
          “只有兩位小數(shù)”只是說輸入的時候是這樣,但實際讀進來的時候是用double保存的,前者是定點,后者是浮點,轉(zhuǎn)換的時候容易出現(xiàn)誤差。
          比如輸入了48.00,有可能在操作過程中就變成47.9999999(關(guān)于這個問題可以看看Computer System: A Programmer's Perspective的第二張浮點部分)
          對于這種情況就需要進行四舍五入了。
          考慮到浮點誤差的問題(另外浮點計算速度也比定點慢很多),所以我建議能用定點就盡量先轉(zhuǎn)到定點。
          int p = floor(dp * 100 + 0.5) 這樣四舍五入就避免了浮點導(dǎo)致的誤差。
          之后再用定點(整型)計算就不會有誤差了。

          # re: URAL 1011[未登錄]  回復(fù)  更多評論   

          2008-05-04 15:05 by dave
          非常感謝你的耐心,我明白了。
          你的blog很棒,+U~

          # re: URAL 1011  回復(fù)  更多評論   

          2008-06-15 07:49 by 爍爍
          有人會PAS版的嗎?
          主站蜘蛛池模板: 花莲县| 仁怀市| 进贤县| 高青县| 太原市| 新和县| 博白县| 东阳市| 抚宁县| 明水县| 奉贤区| 安陆市| 祁阳县| 大理市| 大足县| 正安县| 兴国县| 武夷山市| 化州市| 北碚区| 寿宁县| 睢宁县| 云林县| 道孚县| 诸城市| 西吉县| 钟祥市| 华池县| 遂平县| 成安县| 镇平县| 乳源| 赣州市| 平南县| 镇宁| 长丰县| 灌阳县| 隆德县| 哈巴河县| 华安县| 石台县|