[あなたのレース] ATM CSPフィルム

タイトル説明

  小瀋陽スケッチでは、言った:「人生の中で最も痛みを伴うことが死んでいる、お金が費やしていません。」だから、暁の歌(80才)ATM機から引き出され、すべての貯蓄を過ごすことにしました。シャオの歌は、預金(彼女が覚えている2333銀行カードのパスワード)どのくらいの彼女忘れて、ATMは、この奇妙な預金残高照会機能をサポートしていません。シャオ歌のみ情報彼女の堆積物が堆積物Xの小ソング0(Kなど)Kとの間のランダムな整数であることを意味するK個の元預金の上限であることを知っています。シャオの歌は毎回私たちは、ATMからいくつかのお金を思い付くしようとすることができます。彼女はYドルを取りたい場合はシャオの歌yの元にすぐに、ATM預金よりも大きくありません。小さいyよりも彼女の預金た場合でも、ATMシャオの歌は、警告が表示されます。ワットシャオの歌は複数回警告された場合は、その後、彼女は泥棒と警察によって奪われることになります。シャオの歌は、引き出しの希望の数を最小限にすることが望ましいです。小さなSongcong明のために、彼女は常に最善の戦略をとります。計算シャオの歌は、現金自動預払機からのすべての貯蓄が必要な最小数は数であり、警察によって奪われてはならない削除しました。

入力形式

  各試験サイトは、各試験は、2つの整数K、およびW1≤K、W≤2000を含むテストデータの複数のセット(10グループまで)を含有します

出力フォーマット

  各期待値データ出力引き出しのテストの最小数は6つの小数点以下を四捨五入。
サンプル入力
  。1. 1
  。4 2
  20である。3
サンプル出力
  1.000000
  2.400000
  4.523810
分析

  私は、この80歳の祖母がいない半分だけでなく、DP期待して期待していなかった、いわゆる最適な戦略は半分だけだと思います

  この問題では最善の戦略は、各時間は、プログラムの意思決定の所望の最小数を選択することを意味(悪い言語の悲しみを

  だけではなく、完全な乗りアカウントとお金彼の貯金を指し、シャオ歌の情報ニーズを特定するためには、引き継ぐために彼に言いました。

  $二回警告されるW我々は$まで、$ K $元の上限を知られている(いずれにせよ、情報の2つだけの作品)

  引き出しは、新しい上限を決定するたびに見出すことができます

  我々の理解によると、状態の終了を検討する中で、「完全に取ります」

  $二回警告されるwの終了状態は、最大$には上限$ 0することが知られている($ 0 \当量ワット\当量W $)

  これは、$ DP [i] [j]が最大回jの所望の数を警告することができる、$ Iの既知の上限を表して設けられていてもよいです

  そして、$ DP [0] [j]があります= 0(0 \当量J \当量W)$

  列挙は、各数vを取って、それを転送することができます。

  $$ DP [I] [J] =分(\ FRAC {V} {I + 1} DP [V-1] [J-1] + \ FRAC {I + 1-V}、{I + 1} DP [ IV] [J] +1)$$

  そして、突然、時間の複雑さが$ O(N ^ 2 W)$であることがわかりました。

  しかし、私が前に言ったように、

  80歳の祖母は半分答えはなりますです!

  したがって、最大値を取得するために$ 11 W $は、($ 2 ^ {11} = 2048> $ 2000)で十分です

 コード

書式#include <cstdioを> 
する#include <アルゴリズム>
 使用して 名前空間はstdを、
整数 N、M。ダブル F [ 2005 ] [ 15 ]。
int型のmain()
{
    for(int i=1;i<=2000;i++)for(int j=0;j<=11;j++)f[i][j]=1e10;
    for(int i=1;i<=2000;i++)for(int j=1;j<=11;j++)for(int v=1;v<=i;v++)
    f[i][j]=min(f[i][j],(v)/1.0/(i+1)*f[v-1][j-1]+(i+1-v)/1.0/(i+1)*f[i-v][j]+1.0);
    while(scanf("%d%d",&n,&m)==2)
    {
        m=min(11,m);
        printf("%.6lf\n",f[n][m]);
    }
}

 

 

 

おすすめ

転載: www.cnblogs.com/firecrazy/p/11810368.html