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 = $_ ...
随机推荐
- php composer 开发自己的包
以往都是在项目直接写自己的包文件,并没有把他放在packagist上面,以composer来管理使用. 今天没事来整一下,供大家一起学习 一,在github和packagist分别注册自己的账号,这里 ...
- 【Python开发】增强的格式化字符串format函数
自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱. 语法 它通过{}和 ...
- 关于deepin装机的一些经验总结
最近win10用的有一点腻,虚拟机很久之前就装上了deepin,乌班图,红帽等隶属于Linux一些操作系统,但是终究还是虚拟机所以还是想在真机上试试,所以照着deepin网上的流程装好了deepin并 ...
- sqlalchemy链接数据库
from sqlalchemy import create_engine HOSTNAME = '127.0.0.1' PORT = 3306 DATABASE = 'first_sqlalchemy ...
- myeclipse显示db-brower
myeclipse显示db-brower 这东西怎么调出来? windows->show view->other->db borwser
- api返回数据
控制器里调用方法 <?php namespace app\admin\controller; use app\admin\controller\Base; class Index extends ...
- 自动化测试_百度--糯米中--携程-出行<一>
1:接下来我们看看思路 和相应的功能 使用python+selenium+unittest完成测试脚本 打开chrome浏览器,窗口最大化,设置等待时间10s 打开百度首页 鼠标移动到更多产品,点击 ...
- python网络编程——使用UDP、TCP协议收发信息
UDP UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送. UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内. UDP ...
- 福建工程学院第十四届ACM校赛M题题解 fwt进阶,手推三进制fwt
第九集,结束亦是开始 题意: 大致意思就是给你n个3进制的数字,让你计算有多少对数字的哈夫曼距离等于i(0<=i<=2^m) 思路: 这个是一个防ak题,做法是要手推公式的fwt 大概就这 ...
- 最小生成树之Prim Kruskal算法(转)
最小生成树 首先,生成树是建立在无向图中的,对于有向图,则没有生成树的概念,所以接下来讨论的图均默认为无向图.对于一个有n个点的图,最少需要n-1条边使得这n个点联通,由这n-1条边组成的子图则称为原 ...