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

          URAL 1011

          Posted on 2008-04-23 22:44 ZelluX 閱讀(819) 評(píng)論(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.


          我只能說(shuō)太挫了。。。精度問(wèn)題搞了半天,看來(lái)浮點(diǎn)還是要盡量化成整型再算啊。


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

          評(píng)論

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          這一題看似簡(jiǎn)單,但的確煩人。打擾你了。謝謝。

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

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

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

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

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

          2008-06-15 07:49 by 爍爍
          有人會(huì)PAS版的嗎?
          主站蜘蛛池模板: 军事| 屯昌县| 吉木乃县| 招远市| 蒙阴县| 安达市| 尉氏县| 辽阳市| 芦山县| 永福县| 肇庆市| 图片| 娱乐| 耿马| 金沙县| 临汾市| 巢湖市| 黑龙江省| 阳城县| 黔西| 云安县| 台安县| 琼中| 获嘉县| 霍林郭勒市| 龙岩市| 大厂| 柳江县| 望都县| 获嘉县| 临泽县| 桐柏县| 都安| 长岭县| 昌邑市| 舞阳县| 汉源县| 伊吾县| 新疆| 西峡县| 江达县|