2020-2021 ACM-ICPC Brazil Subregional Programming Contest

本文详细解析了2020-2021年ACM-ICPC巴西次区域编程竞赛中的部分题目,包括Sticker Album、Battleship、Party Company等,涉及动态规划、树形结构、暴力模拟等多种算法解题思路。
摘要由CSDN通过智能技术生成

2020-2021 ACM-ICPC Brazil Subregional Programming Contest

A.Sticker Album

题意: 给你一个容量为n的卡牌收集册,以及无限个卡牌包,卡牌包有[a,b]个卡牌,取出的卡牌数是等概率分布的,言外之意你有 1 b − a + 1 {\frac{1}{b-a+1}} ba+11的概率取出a、a+1、…、b张卡牌。问你把卡牌收集册集满时的概率期望是多少。

题解: 动态规划,设 d p [ i ] dp[i] dp[i]:已经有i张手牌,要集满n张还需要的卡牌数目。转移方程为: d p [ i ] = ( d p [ i + a ] + 1 ) + ( d p [ i + a + 1 ] + 1 ) + . . . + ( d p [ i + b ] + 1 ) b − a + 1 = d p [ i + a ] + d p [ i + a + 1 ] + . . . + d p [ i + b ] b − a + 1 + 1 dp[i] = \frac{(dp[i + a] + 1) + (dp[i + a + 1] + 1) + ... + (dp[i + b] + 1)}{b - a + 1} = \frac{dp[i+a] + dp[i+a+1] + ... + dp[i+b]}{b - a+ 1} + 1 dp[i]=ba+1(dp[i+a]+1)+(dp[i+a+1]+1)+...+(dp[i+b]+1)=ba+1dp[i+a]+dp[i+a+1]+...+dp[i+b]+1

然而当a=0时会出现问题,那么式子为: d p [ i ] = ( d p [ i ] + 1 ) + ( d p [ i + 1 ] + 1 ) + . . . + ( d p [ i + b ] + 1 ) b − 1 dp[i] = \frac{(dp[i] + 1) + (dp[i + 1] + 1) + ... + (dp[i + b] + 1)}{b - 1} dp[i]=b1(dp[i]+1)+(dp[i+1]+1)+...+(dp[i+b]+1),转换为: d p [ i ] = ( d p [ i + 1 ] + d p [ i + 2 ] + . . . d p [ i + b ] b − a + 1 + 1 ) ∗ l l − 1 dp[i] = (\frac{dp[i + 1] + dp[i + 2] + ...dp[i+b]}{b - a + 1} + 1) * \frac{l}{l-1} dp[i]=(ba+1dp[i+1]+dp[i+2]+...dp[i+b]+1)l1l

代码:

#include <bits/stdc++.h>

#define int long long
using namespace std;

inline int read() {
   
    int s = 0, w = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
   
        if (ch == '-') w = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
    return s * w;
}

int const MAXN = 2e6 + 10;
int n, m, T, a, b;
double dp[MAXN];
signed main() {
   
    int n, a, b, len;
    cin >> n >> a >> b;
    len = b - a + 1;
    dp[n] = 0.0;
    double sum = 0.0;
    for (int i = n - 1; i >= 0; i--) {
   
        if (!a) {
   
            dp[i] = (sum + len * 1.0) / (len - 1.0);
            sum -= dp[i + b];
            sum += dp[i];
        } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值