zoukankan      html  css  js  c++  java
  • HDU 5236 Article (概率DP+贪心)

    题意:要求输入一篇N个字符的文章,对所有非负整数i:每到第i+0.1秒时可以输入一个文章字符,每到第i+0.9秒时有P的概率崩溃(回到开头或者上一个存盘点)

    每到第i秒有一次机会可以选择按下X个键存盘,或者不存,打印完整篇文章之后必须存盘一次才算完成输入多组N,P,X选择最佳策略使得输入完整篇文章时候按键的期望最小,

    输出此期望

    析:dp[i]表示打完前 i 个字符,概论是多少,dp[i] = dp[i-1] + p(1+dp[i]) + 1-p。然后解得dp[i] = (dp[i-1]+1) / (1-p)。

    最后再枚举多少次保存。均匀分布是最优的。

    代码如下:

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include <cstdio>
    #include <string>
    #include <cstdlib>
    #include <cmath>
    #include <iostream>
    #include <cstring>
    #include <set>
    #include <queue>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <cctype>
    #include <cmath>
    #include <stack>
    #include <sstream>
    #define debug() puts("++++");
    #define gcd(a, b) __gcd(a, b)
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define freopenr freopen("in.txt", "r", stdin)
    #define freopenw freopen("out.txt", "w", stdout)
    using namespace std;
    
    typedef long long LL;
    typedef unsigned long long ULL;
    typedef pair<int, int> P;
    const int INF = 0x3f3f3f3f;
    const LL LNF = 1e16;
    const double inf = 0x3f3f3f3f3f3f;
    const double PI = acos(-1.0);
    const double eps = 1e-8;
    const int maxn = 1e5 + 10;
    const int mod = 1e9 + 7;
    const int dr[] = {-1, 0, 1, 0};
    const int dc[] = {0, 1, 0, -1};
    const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
    int n, m;
    const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    inline bool is_in(int r, int c){
      return r >= 0 && r < n && c >= 0 && c < m;
    }
    double dp[maxn];
    
    int main(){
      int T;  cin >> T;
      for(int kase = 1; kase <= T; ++kase){
        double p;
        scanf("%d %lf %d", &n, &p, &m);
        dp[0] = 0;
        for(int i = 1; i <= n; ++i)  dp[i] = (dp[i-1]+1) / (1-p);
        double ans = inf;
        for(int i = 1; i <= n; ++i){
          int a = n / i;
          int b = n % i;
          ans = min(ans, dp[a+1] * b + dp[a] * (i-b) + (double)m*i);
        }
        printf("Case #%d: %f
    ", kase, ans);
      }
      return 0;
    }
    

      

  • 相关阅读:
    HDU 1022 Train Problem I
    HDU 1702 ACboy needs your help again!
    HDU 1294 Rooted Trees Problem
    HDU 1027 Ignatius and the Princess II
    HDU 3398 String
    HDU 1709 The Balance
    HDU 2152 Fruit
    HDU 1398 Square Coins
    HDU 3571 N-dimensional Sphere
    HDU 2451 Simple Addition Expression
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/6786744.html
Copyright © 2011-2022 走看看