Gym - 101987G Secret Code (概率+数学积分)
题意:有A,B,C三个人要见面,每个人在[0,S]随机选择一个时间点作为见面时间,先到的那个人要等下一个人来了之后和他确认信息,然后马上就走。
例如,假如A先到,B其次,C最后到,那么A要等B到了之后和B确认完信息,然后A走,B再等C到了和C确认完信息,这样任务就完成了。
现给出A,B,C三人的最长等待时间wa,wb,wc,求任务能完成的概率。
题意等价于给出三条长度分别为wa,wb,wc且左端点在[0,S]内随机取值的线段,求第一条线段与第二条线段相交且第二条线段与第三条线段相交的概率。
假如A先到,B其次,C最后到,那么A的左端点取值范围在[0,S]间,B的左端点取值范围在[A,min(A+wa,S)]间,C的左端点取值范围在[B,min(B+wb,S)]间,因此A,B,C三点的取值空间对应的体积为$\int_{0}^{S}dA\int_{A}^{min(A+wa,S)}min(B+wb,S)dB$,这个积分直接求不大容易,可以用自适应simpson暴力搞一搞(注意要多分几段,确保不会出现观测错误)。由于A,B,C的先后排列顺序一共有6种情况,而且每种情况出现的概率相等,因此对每种情况分别求一下积分,然后除以S^3就是所求概率了。
#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef db fun(db);
const db eps=1e-;
const int N=+;
db S,w[],buf[];
int n,p[];
db simpson(db l,db r,fun f) {return (f(l)+f(r)+*f((l+r)/2.0))*(r-l)/6.0;}
db rsimpson(db l,db r,fun f) {
db mid=(l+r)/2.0;
db a=simpson(l,r,f),b=simpson(l,mid,f),c=simpson(mid,r,f);
if(fabs(a-b-c)<eps)return b+c;
return rsimpson(l,mid,f)+rsimpson(mid,r,f);
}
db itg(db l,db r,fun f,int n=) {
db ret=,di=(r-l)/n;
for(db i=l; i<r-eps; i+=di)ret+=rsimpson(i,i+di,f);
return ret;
}
db fC(db x) {return 1.0;}
db fBC(db B0) {return min(B0+w[],S)-B0;}
db fAB(db A0) {return rsimpson(A0,min(A0+w[],S),fBC);}
db eq(db x,db y) {return fabs(x-y)<eps;}
db solve() {return itg(,S,fAB);}
struct P {
db ans;
int i;
bool operator<(const P& b)const {return eq(ans,b.ans)?i<b.i:ans<b.ans;}
} q[N];
int main() {
scanf("%d",&n);
for(int i=; i<n; ++i) {
scanf("%lf%lf%lf%lf",&S,&buf[],&buf[],&buf[]);
db ans=;
for(int i=; i<; ++i)p[i]=i;
do {
for(int i=; i<; ++i)w[i]=buf[p[i]];
ans+=solve();
} while(next_permutation(p,p+));
ans/=S*S*S;
q[i]= {ans,i};
}
sort(q,q+n);
for(int i=; i<n; ++i)printf("%d%c",q[i].i+," \n"[i==n-]);
return ;
}
还有一种比较直观的做法,首先忽略C,画出A,B的分布空间,是一个二维平面上的梯形,如图所示:

接下来考虑C的取值,由于C的取值只与B有关,因此可以根据y轴上的位置来确定C的取值范围。可以发现,在B∈[0,S-wb]时,C的取值范围恒为[B,B+wb],长度恒为wb,而在B∈[S-wb,S]时,C的取值范围是成线性递减的。综上,可以把总的积分划分成V1和V2两个部分,其中V1=wa*wa*wb/2+(S-wa-wb)*wa*wb,V2=wa*wb*wb/2,化简即为(S-(wa+wb)/2)*wa*wb。
#include<bits/stdc++.h>
using namespace std;
typedef double db;
const int N=+;
db S,w[];
int n;
struct P {
db ans;
int i;
bool operator<(const P& b)const {return ans==b.ans?i<b.i:ans<b.ans;}
} q[N];
int main() {
scanf("%d",&n);
for(int i=; i<n; ++i) {
scanf("%lf%lf%lf%lf",&S,&w[],&w[],&w[]);
db ans=;
for(int i=; i<; ++i)
for(int j=i+; j<; ++j)
ans+=(S*-w[i]-w[j])*w[i]*w[j];
ans/=S*S*S;
q[i]= {ans,i};
}
sort(q,q+n);
for(int i=; i<n; ++i)printf("%d%c",q[i].i+," \n"[i==n-]);
return ;
}
Gym - 101987G Secret Code (概率+数学积分)的更多相关文章
- Android Secret Code
我们很多人应该都做过这样的操作,打开拨号键盘输入*#*#4636#*#*等字符就会弹出一个界面显示手机相关的一些信息,这个功能在Android中被称为android secret code,除了这些系 ...
- hdu.1111.Secret Code(dfs + 秦九韶算法)
Secret Code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- Android 编程下的 Secret Code
我们很多人应该都做过这样的操作,打开拨号键盘输入 *#*#4636#*#* 等字符就会弹出一个界面显示手机相关的一些信息,这个功能在 Android 中被称为 Android Secret Code, ...
- The secret code
The secret code Input file: stdinOutput file: stTime limit: 1 sec Memory limit: 256 MbAfter returnin ...
- [swustoj 679] Secret Code
Secret Code 问题描述 The Sarcophagus itself is locked by a secret numerical code. When somebody wants to ...
- 洛谷 P3102 [USACO14FEB]秘密代码Secret Code 解题报告
P3102 [USACO14FEB]秘密代码Secret Code 题目描述 Farmer John has secret message that he wants to hide from his ...
- HDU 1111 Secret Code(数论的dfs)
Secret Code Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- Secret Code
Secret Code 一.题目 [NOIP模拟赛A10]Secret Code 时间限制: 1 Sec 内存限制: 128 MB 提交: 10 解决: 6 [提交][状态][讨论版] 题目描述 ...
- 【微信】根据appid, secret, code获取用户基本信息
function getUserInfo(){ $appid = "yourappid"; $secret = "yoursecret"; $code = $_ ...
随机推荐
- 【ABAP系列】【第六篇】SAP ABAP7.50 之隐式增强
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列][第六篇]SAP ABAP7.5 ...
- @lazy注解
默认情况下,Spring会在应用程序上下文的启动时创建所有单例bean 主要针对单实例 Bean ,容器启动时不创建对象,仅当第一次使用Bean的时候才创建 @Lazy @Bean public Pe ...
- 电脑的sid
SID的查询方法:1.Win键+R键,打开运行,输入CMD2.输入:whoami /user3.就可以看到本机的SID了 SID的修改方法1.下载NewSID软件,并打开 2.可以指定一个SID,也可 ...
- Windows 2016 安装单机版本Oracle ASM 的简单说明
发现这样弄完 启动之后 就挂了 真蛋疼. 改天再研究一下. 1. 需要给磁盘处理一下 建议使用压缩卷的模式进行处理 如图示 需要新建简单卷 注意设置 然后不进行格式化 2. 然后安装oracle的g ...
- Shell初学(七)linux账户管理/群组管理
[1]新建用户 用户相关文件:/etc/passwd /etc/shadow useradd useradd的默认预设 [2]设置密码 passwd 常见修改密码使用技巧: echo "1 ...
- HanLP-停用词表的使用示例
停用词表的修改 停用词表在“pyhanlp\static\data\dictionary”路径下的“stopwords.txt”文件中,CoreStopWordDictionary.apply方法支持 ...
- PLSQL中查到的数据和程序中查询到的不一样
1.首先看下你的修改或者新增的SQL是否提交.
- AssertionError [ERR_ASSERTION]: Task function must be specified,gulp版本不一致
报错信息: vue项目打包报错 > innovate-admin-vue@ build /home/soldier/SOLDIER/IDE_project/webStorm_project/in ...
- BugkuCTF--never give up
这道题还挺有意思的... http://123.206.87.240:8006/test/hello.php 查看元素,有个1p.html,访问. 还没看到网页元素就跳转了...抓包! 抓到了一堆东西 ...
- Docker学习1
命名空间(Namesaoces):Linux内核提供的一种对进程资源隔离的机制,例如网络.进程.挂载点等资源. 控制组(CGroups):Linux内核提供的一种限制进程资源的机制:例如CPU.内存等 ...