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

          URAL 1011

          Posted on 2008-04-23 22:44 ZelluX 閱讀(816) 評論(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是開區間還是閉區間,總之Wrong Answer了無數次后總算過了。。。

          評論

          # re: URAL 1011  回復  更多評論   

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

          # re: URAL 1011  回復  更多評論   

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

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

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

          int p = dp * 100;
          有區別嗎?

          # re: URAL 1011  回復  更多評論   

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

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

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

          # re: URAL 1011  回復  更多評論   

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

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

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

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

          # re: URAL 1011  回復  更多評論   

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

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

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

          # re: URAL 1011  回復  更多評論   

          2008-06-15 07:49 by 爍爍
          有人會PAS版的嗎?
          主站蜘蛛池模板: 张家川| 阳江市| 雷州市| 平和县| 利辛县| 鄢陵县| 盐边县| 海晏县| 开阳县| 惠水县| 博爱县| 林甸县| 台中县| 宜君县| 平湖市| 尉犁县| 石城县| 渭源县| 宝山区| 澄城县| 农安县| 彭阳县| 柳林县| 波密县| 永嘉县| 梁山县| 泾阳县| 乌拉特前旗| SHOW| 武安市| 偏关县| 海淀区| 曲沃县| 玉屏| 那曲县| 盐亭县| 新兴县| 乐清市| 崇礼县| 灵武市| 清远市|