2017.10.10 杀人游戏 思考记录
这个题题目描述还是有一点问题。。这里的知道关系是有传递性的。第一次理解成只会明白直接相连的,最小点覆盖 …… 这样就成np了吧。。
所以就比较显然了,,对于每组能互达的强连通分量,都只需一个头上的点就可以便利整组强连通分量
然后仅剩一个是可以推的,特判一下。
答案=(n-必须访问人数)/n
证明:第一个访问的人是安全的概率 (n-1)/n
设第一个人能知道m1个人
找出的m1个人中有杀手的概率 (m1)/(n-1)
找第一个人就结束的概率== (n-1)/n * (m1)/(n-1) ==m1/n
找出的m1个人中没有杀手的概率 (n-1)/n *(n-1-m1)/(n-1)=(n-1-m1)/n
第二个访问的人是安全的概率 (n-m1-2)/(n-m1-1)
设第二个人能知道m2个人
找出的m2个人中有杀手的概率 (m2)/(n-m1-2),,若m1+m2+2已经==n,则这个概率==1
找第二个人就结束的概率== (n-1-m1)/n * (n-m1-2) / (n-m1-1) * 1 =(n-m1-2)/n
最后概率=m1 / n +(n-m1-2)/n==(n-2)/n 2即是访问人数
不知道这算不算证明,,
码:
#include<iostream>
#include<cstdio>
using namespace std;
#include<vector>
#define N 100005
vector<int>v[N],jh[N],v2[N];
int tot,dfn[N],low[N],cnt,top,zhan[N],sy[N],rd[N],n,i,j,m,a,b,k,now[N];
double ans;
void tarjan(int o)
{dfn[o]=low[o]=++tot;zhan[++top]=o;int i;for(i=0;i<v[o].size();i++){int nd=v[o][i];if(!dfn[nd]){tarjan(nd);low[o]=min(low[nd],low[o]);}else{if(sy[nd]==0)low[o]=min(low[nd],low[o]); }}if(low[o]==dfn[o]){++cnt;while(zhan[top]!=o){int nd=zhan[top];jh[cnt].push_back(nd);sy[nd]=cnt;top--;} int nd=zhan[top];jh[cnt].push_back(nd);sy[nd]=cnt;top--;}
}
void work()
{bool kys=0;tot=0;for(i=1;i<=cnt;i++){if(rd[i]==0){tot++;bool ky=1;if(jh[i].size()!=1)ky=0;for(j=0;j<v2[i].size();j++){
if(rd[v2[i][j]]==1)ky=0; }
if(ky==1)kys=1; } }if(kys)tot--;ans=double(n-tot)/n;
}
int main()
{scanf("%d%d",&n,&m);if(n==1){ printf("1.000000");return 0;}for(i=1;i<=m;i++){scanf("%d%d",&a,&b);v[a].push_back(b); }
for(i=1;i<=n;i++)if(dfn[i]==0)tarjan(i);for(i=1;i<=cnt;i++){for(j=0;j<jh[i].size();j++){int st=jh[i][j];for(k=0;k<v[st].size();k++)
{int nd=v[st][k];if(sy[nd]==i)continue;v2[i].push_back(sy[nd]);if(now[sy[nd]]!=i)rd[sy[nd]]++,now[sy[nd]]=i;
}} }work(); printf("%.6lf",ans);
}
2017.10.10 杀人游戏 思考记录相关推荐
- 2017.3.24 分裂游戏 思考记录
事先说明:这不是好题解,这只是思考记录 同机房的xp都学博弈了.. 感觉还是学学看吧 先来看一下简单的nim: 题目: Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个 ...
- 2017.10.13 硬币游戏 思考记录
这个题用特征法可以比较好的找到思路 首先这个题有两个特征:1.正+反=反 反+正=反 正+正=正 反+反=正 应该能很快想到亦或 2.范围1e5 + 上限2^60 应该能很快想到倍 ...
- 2017.4.27 道路游戏 思考记录
这个题一开始把题读错了..而且读错三次(出这种语文题 简直毒瘤) 一开始认为成了可以一边买一边跑...结果发现是n^4 然后认为成了可以不移动结束就可以买....结果发现是n^3 于是全wa 然后认 ...
- 2017.9.10 连续攻击游戏 思考记录
这个题..可以把它当成结论题搞, 结论就是对于每个数字的出现次数,如果区间1~n内的出现次数都>=2,那么这个区间1~n内都会合法 这个结论很好证明,连到外面可以视为停止 外面连进来的可以视 ...
- 2017.10.29 染色方案 思考记录
这个题数据特别小,于是想到状压多维之流. 状压是比较麻烦的,虽然也能写,但多维dp明显要好写一些 根据15去设计状态是没有前途的,因为按颜色分一定会MLE 这时就考虑根据5分,这样不同颜色就离散了,就 ...
- 2017.10.9 放棋子 思考记录
.这个题根本没想到错排,但它似乎离散为斜对角之后很有规律,于是打表,推出了式子... 经常手玩式子,前几天的测试根本没想到卡特兰数然后用组合数硬生生凑了出来,然后这个题的错排.. f表示答案 g表示 ...
- 2017.10.24 上升序列 思考记录
终于有会做的题了... 一开始想用正常的lis ,然后从前往后扫, 由于最优查询区间在序列上是按顺序单调递增的,所以想记录每个点取哪个值跳到哪,这样是n*m logn的 然后发现既然是单调递增的那直接 ...
- 2017.10.7 括号序列 思考记录
这个题看起来很简单,但细节比较麻烦.参考完别人的代码后才想出自己的解法的.. 一开始认为已匹配的括号是可以直接消的,所以就只维护了两个变量 但还有区间取反.. 由于和已配对的括号的顺序有关,所以不是很 ...
- 2017.10.30 覆盖问题 思考记录
从细节入手已经从一种技巧变成一种策略了. 题目给出的条件很奇怪,是3个正方形,, 为什么是3个而不是4个或2个呢.. 于是先用一个大矩形把所有点卡住 然后显然矩形的每个边 都有一个正方形和他在一条直线 ...
最新文章
- 应用内设置语言不重启方法
- $(@_config=)什么意思?
- 启动elasticsearch命令_快速安装ElasticSearch
- mysql ef_在EF中使用MySQL的方法及常见问题
- 产品经理十八章:产品创新能力(二)
- 改改Python代码,运行速度还能提升6万倍,Science:先别想摩尔定律了
- oracle signed类型,char、signed char 和 unsigned char 的区别
- 【LeetCode 剑指offer刷题】树题19:8 二叉树中序遍历的下一个结点
- python多态如何理解_大家对python中多态是如何理解的?
- hdu1059Dividing
- 使用Quartz做定时器
- pyCharm汉化方法
- JAVA中读取配置文件以及修改配置文件
- gltf、glb模型下载
- 关于docker容器启动后,浏览器无法正常访问相关问题——docker 宿主机与容器不通
- java微信支付超时_Java语言:微信支付之关闭订单
- php系统性能分析论文,系统性能分析-PHP/Linux@HeFei-51CTO博客
- 公众号(服务号)申请与认证
- EasyDarwin开源流媒体服务器
- 两个常用算法day1
热门文章
- python xposed_xposed + python 怎么爬取微信朋友圈的数据
- 打开Jupyter Notebook 时报错:EnvironmentLocationNotFound: Not a conda environment:
- 怎样对流媒体进行压力测试_对node工程进行压力测试与性能分析「干货」
- inline函数_逼近函数(2)
- EmEditor18.1.2 注册码
- 初步使用计算机学设计,幼儿园计算机教学设计参考
- webpack打包压缩混淆_细说webpack系列 3. webpack-cli 零配置打包
- 禅道的安装与简单使用
- 二叉搜索树的删除操作可以交换吗_一文看懂数据结构中的树
- matlab分支定界法linprog_序列比对(二十二)——中间字符串分支定界方法中更紧的界...