zoukankan      html  css  js  c++  java
  • 牛客——Mocha 的数据包

    原题链接

    思路:

    (f[i])表示最优情况下发送(i)个数据包的期望代价。
    考虑怎么发送是最优的。
    直接说结论吧,每次将未发送的k个数据包全部发送为最优策略。
    证明见出题人题解
    所以类似于dp的转移,每次的代价为代价和乘以概率。
    枚举发送(i)个数据包的期望代价:
    (i)个数据包全发送成功的概率为(1)-数据包都不成功的概率;
    代价的话:最开始的代价为(fib[n-i+1]),然后枚举这次发送成功了(j)个,所以上次发送成功了(i-j)个,
    每次的代价都为

    [c[i][j]*(p/q)^{j}*(1-p/q)^{i-j}*f[i-j] ]

    (c[i][j])表示从i个数据包里选j个是本次发送成功的;
    ((p/q)^{j})表示j个数据包发送成功的概率;
    ((1-p/q)^{i-j})表示(i-j)个数据包发送不成功的概率;
    (f[i-j])表示(i-j)个数据包全部发送的最优策略的期望代价。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<ll, ll>PLL;
    typedef pair<int, int>PII;
    typedef pair<double, double>PDD;
    #define I_int ll
    inline ll read()
    {
        ll x = 0, f = 1;
        char ch = getchar();
        while(ch < '0' || ch > '9')
        {
            if(ch == '-')f = -1;
            ch = getchar();
        }
        while(ch >= '0' && ch <= '9')
        {
            x = x * 10 + ch - '0';
            ch = getchar();
        }
        return x * f;
    }
    #define read read()
    #define closeSync ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
    #define multiCase int T;cin>>T;for(int t=1;t<=T;t++)
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i<(b);i++)
    #define per(i,a,b) for(int i=(a);i>=(b);i--)
    #define perr(i,a,b) for(int i=(a);i>(b);i--)
    ll ksm(ll a, ll b, ll p)
    {
        ll res = 1;
        while(b)
        {
            if(b & 1)res = res * a % p;
            a = a * a % p;
            b >>= 1;
        }
        return res;
    }
    const int inf = 0x3f3f3f3f;
    #define PI acos(-1)
    const double eps = 1e-8;
    const int maxn =1e6+7;
    const ll mod=998244353;
    ll n,p,q;
    ll fib[maxn];
    ll c[2100][2100],f[maxn];
    void init(ll n){
    	fib[1]=1;
    	for(int i=2;i<=n;i++)
    		fib[i]=(fib[i-1]+fib[i-2])%mod;
    	for(int i=0;i<=n;i++)
    		for(int j=0;j<=i;j++){
    			if(j==0) c[i][j]=1;
    			else c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
    		}
    }
    
    int main(){
    	cin>>n>>p>>q;
    	init(n);
    	ll win=p*ksm(q,mod-2,mod)%mod;
    	ll lose=(q-p+mod)%mod*ksm(q,mod-2,mod)%mod;
    	for(int i=1;i<=n;i++){
    		ll sum=fib[n-i+1];
    		for(int j=1;j<=i;j++)
    			sum=(sum+f[i-j]*ksm(win,j,mod)%mod*ksm(lose,i-j,mod)%mod*c[i][j]%mod)%mod;	
    		f[i]=sum*ksm((1-ksm(lose,i,mod)+mod)%mod,mod-2,mod)%mod;
    	}
    	cout<<f[n]<<endl;
    	return 0;
    }
    
    
    
    
    
    
    
    
    
    
    
    
  • 相关阅读:
    TortoiseGit 的下载与安装
    CountDownLatch在多线程程序中的应用
    IDEA中maven的依赖jar包报红
    监控中的TP50
    BeanUtils.copyProperties方法,当属性Date为null解决
    SimpleDateFormat的安全问题解决方法
    java修饰符用法
    java实现快速排序
    京东2016实习生编程题—生日礼物
    美图笔试算法题(两个人拿石头判断输赢)
  • 原文地址:https://www.cnblogs.com/OvOq/p/14750893.html
Copyright © 2011-2022 走看看