【DP】奖励卡(jzoj 3937)
奖励卡
jzoj 3937
题目大意
现在有一场比赛,想观看的人要提交申请,现在有x个人提交后得到两个号,y个人提交后得到一个号,有n轮抽号,每一轮抽一个号(概率相等),这个号的所有者不参与下一轮抽号(即他的所有号消掉),现在问你:你拿一个号和拿两个号抽中的概率(你不算在前面的x,y中,写得很乱,见谅)
输入样例
输入样例#1
1 1 2
输入样例#2
10 10 10
输出样例
输出样例#1
0.3333333333333333
0.2
输出样例#2
0.5870875690480144
0.3640355515319861
输出要求
答案误差不得超过10−910^{-9}10−9。
数据范围
对于 10%的数据,n⩽2。n\leqslant 2。n⩽2。
对于 20%的数据,n⩽3。n\leqslant 3。n⩽3。
对于 30%的数据,n⩽4,a,b⩽4。n\leqslant 4,a,b\leqslant 4。n⩽4,a,b⩽4。
对于 60%的数据,n⩽3000,a,b⩽2000。n\leqslant 3000,a,b\leqslant 2000。n⩽3000,a,b⩽2000。
对于 100%的数据,1⩽n⩽3000,0⩽a,b⩽109。1\leqslant n\leqslant 3000,0\leqslant a,b\leqslant 10^9。1⩽n⩽3000,0⩽a,b⩽109。
解题思路
因为n有3000,a、b有10910^9109,所以我们不可能枚举每一轮抽到谁
那我们可以想到DPDPDP
我们设f[i][j]f[i][j]f[i][j]为第iii轮为止有jjj个有两个号的人中了且你还没中的概率
由f[i][j]f[i][j]f[i][j]转移的状态有三个:f[i][j]f[i][j]f[i][j],f[i][j+1]f[i][j+1]f[i][j+1]和你中了
然后分开转移即可
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n, a, b;
double x, y, ans, f[3050][3050];
int main()
{scanf("%d%d%d", &n, &a, &b);a++; //先处理拿两个号的情况f[0][0] = 1;//100%for (int i = 0; i < min(n, a + b); ++i)//要保证不会回合比人数多for (int j = 0; j <= min(a, i); ++j)//要保证中了的人数要小于回合数{x = (double)(a - j);//a中中了j个,剩下的(a-j)个y = (double)(b - (i - j));//i回合,a中中了j个,b中中了(i-j)个,剩下(b-(i-j))个f[i + 1][j + 1] += f[i][j] * ((x - 1) * 2) / (x * 2 + y);//(x*2+y)个号,有((x-1)*2)个号不是你的且是a类剩下的f[i + 1][j] += f[i][j] * y / (x * 2 + y);//y个人是b类剩下的ans += f[i][j] * 2 / (x * 2 + y);//你有两张票}printf("%.16g\n", ans);a--;//减去原先的b++;//现在枚举你有一张票ans = 0;memset(f, 0, sizeof(f));f[0][0] = 1;for (int i = 0; i < min(n, a + b); ++i)for (int j = 0; j <= min(a, i); ++j){x = (double)(a - j);y = (double)(b - (i - j));f[i + 1][j + 1] += f[i][j] * (x * 2) / (x * 2 + y);f[i + 1][j] += f[i][j] * (y - 1) / (x * 2 + y);//(y-1)个号不是你的切实b类剩下的ans += f[i][j] / (x * 2 + y);//你只有一个号}printf("%.16g", ans);return 0;
}
【DP】奖励卡(jzoj 3937)相关推荐
- P2396 yyy loves Maths VII 状压dp 变态卡常
很容易想到dp,但是1<<24都有1600w的复杂度,要是普通做法肯定T掉 共有maxs=(1<<n)-1种情况 首先f[ ]记录某种情况的方案数,dis[ ]记录某种情况的步 ...
- [dp][前缀和] Jzoj P5907 轻功(qinggong)
Description 题目背景: 尊者神高达进入了基三的世界,作为一个 mmorpg 做任务是必不可少的,然而跑地图却令人十分不爽.好在基三可以使用轻功,但是尊者神高达有些手残,他决定用梅花桩练习轻 ...
- 《dp补卡——子序列问题》
目录 300. 最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组 1143. 最长公共子序列 53. 最大子序和 392. 判断子序列 115. 不同的子序列 583. 两个字符串 ...
- 《dp补卡——买卖股票问题》
目录 121. 买卖股票的最佳时机 贪心 dp思路 滚动数组优化 122. 买卖股票的最佳时机 II 123. 买卖股票的最佳时机 III 188. 买卖股票的最佳时机 IV 309. 最佳买卖股票时 ...
- 《dp补卡——多重背包》
多重背包简介: 有N种物品和一个容量为V的背包.第i种物品最多有Mi件可用,每件耗费的空间为Ci,价值为Wi.求解将哪些物品装入背包可使得这些物品耗费的空间总和不超过背包容量,且价值总和最大. 将Mi ...
- 《dp补卡——完全背包问题》
N件物品和一个最多能背重量为W的背包.第i件物品的重量为weight[i],得到的价值是value[i].每件物品都有无限个(可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大. 01背包和 ...
- 《dp补卡——01背包问题》
目录 01背包 [416. 分割等和子集](https://leetcode-cn.com/problems/partition-equal-subset-sum/) [1049. 最后一块石头的重量 ...
- 《dp补卡——343. 整数拆分、96. 不同的二叉搜索树》
343. 整数拆分 1.确定dp数组以及下标含义. dp[i]:分拆数字i,可以得到的最大的乘积 2.确定递推公式: dp[i]最大乘积出处:从1遍历j到i,j * dp[i-j] 与 j * (i- ...
- 【DP专题】——jzoj 6305. 最小值
dp+单调栈 6305. 最小值 (File IO): input:min.in output:min.out Time Limits: 1000 ms Memory Limits: 131072 ...
最新文章
- Python实现俄罗斯方块
- html瀑布式原理,纯css3+html瀑布流效果
- POJ3481(待完善版本,请看注释)
- java.lang object math string,面向对象知识点回顾
- hdoj3351-stack
- TensorFlow2.0:张量的数学运算
- 华为android怎么换字体大小,华为手机设置字体大小的具体步骤
- 从零开始编译LEDE固件 默认中文material主题_php_sir_新浪博客
- 设计模式(创建型模式)-抽象工厂模式
- 走查是什么意思啊?如何给原稿进行走查?
- Mac 破解百度云盘限速下载问题
- 大数据与Hadoop系列之分布式文件系统(一)
- python反距离权重法_先从IDW(反距离权重)插值开始吧
- 计算机三级网络技术知识点大全(二)
- 报错:Unsupported major.minor version 52.0 (jar包对不同JDK版本的兼容性问题:)
- 我的爸爸正在计算机前写报告,关于计算器的作文结尾
- [句型]二十一、there be 句型 和 情态动词
- crontab java job_crontab定时任务安装和解析
- flash动画------豹子奔跑
- 什么是长尾关键词?长尾关键词有什么价值?
热门文章
- handler原子锁_Linux的原子操作与同步机制
- oracle 动态游标行数,oracle动态游标的简单实现方法
- java怎么将前端的数据存到关联的表中_Java程序员最可能被考到的14个面试题
- Java 文件的拷贝
- [Redis6]跳跃表(跳表)
- [Java基础]File基础
- [剑指offer]面试题21:包含min函数的栈
- Lambda表达式(多线程实现)
- 二叉树-树转二叉树 使用队列,编写transfrom函数,将普通树转换成对应的二叉树。
- word List40