首页 > 其他分享 >BZOJ 1415: [Noi2005]聪聪和可可 期望dp

BZOJ 1415: [Noi2005]聪聪和可可 期望dp

时间:2023-07-07 13:36:04浏览次数:50  
标签:可可 ch 聪聪 样例 Noi2005 景点 include 1415



1415: [Noi2005]聪聪和可可


Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 1682  Solved: 991

[Submit][Status][Discuss]

Description



Input


数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数。 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号。 接下来E行,每行两个整数,第i+2行的两个整数Ai和Bi表示景点Ai和景点Bi之间有一条路。 所有的路都是无向的,即:如果能从A走到B,就可以从B走到A。 输入保证任何两个景点之间不会有多于一条路直接相连,且聪聪和可可之间必有路直接或间接的相连。


Output


输出1个实数,四舍五入保留三位小数,表示平均多少个时间单位后聪聪会把可可吃掉。


Sample Input


【输入样例1】
4 3
1 4
1 2
2 3
3 4
【输入样例2】
9 9
9 3
1 2
2 3
3 4
4 5
3 6
4 6
4 7
7 8
8 9


Sample Output


【输出样例1】
1.500
【输出样例2】
2.167


HINT


【样例说明1】

开始时,聪聪和可可分别在景点1和景点4。

第一个时刻,聪聪先走,她向更靠近可可(景点4)的景点走动,走到景点2,然后走到景点3;假定忽略走路所花时间。

可可后走,有两种可能:

第一种是走到景点3,这样聪聪和可可到达同一个景点,可可被吃掉,步数为1,概率为 。

第二种是停在景点4,不被吃掉。概率为 。

到第二个时刻,聪聪向更靠近可可(景点4)的景点走动,只需要走一步即和可可在同一景点。因此这种情况下聪聪会在两步吃掉可可。

所以平均的步数是1* +2* =1.5步。



对于所有的数据,1≤N,E≤1000。

对于50%的数据,1≤N≤50。



最全题解看这里

先BFS 搞出所有情况下聪聪的路径

然后把期望dp式子搞出来


#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<complex>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<queue>
#include<set>
#include<map>
using namespace std;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return x*f;
}
const int N=1010;
int n,m,C,K,ecnt,dis[N],last[N],c[N][N],q[N],de[N],k[N][N];
double f[N][N];
struct EDGE{int to,nt;}e[N<<4];
inline void readd(int u,int v){e[++ecnt]=(EDGE){v,last[u]};last[u]=ecnt;}
inline void add(int u,int v){readd(v,u);readd(u,v);}
inline void bfs(int u)
{
	memset(dis,0,sizeof(dis));
	int head=1,tail=1;dis[u]=1;c[u][u]=u;
	for(int i=last[u];i;i=e[i].nt)c[u][e[i].to]=e[i].to,dis[e[i].to]=2,q[tail++]=e[i].to;
	while(head<tail)
	{
		int tmp=q[head++];
		for(int i=last[tmp];i;i=e[i].nt)
		if(!dis[e[i].to]||(dis[tmp]+1==dis[e[i].to]&&c[u][tmp]<c[u][e[i].to]))
		{
			dis[e[i].to]=dis[tmp]+1;
			c[u][e[i].to]=c[u][tmp];
			q[tail++]=e[i].to;
		}
	}
}
double dp(int x,int y)
{
	if(f[x][y])return f[x][y];
	if(x==y)return 0;
	if(c[x][y]==y||c[c[x][y]][y]==y)return f[x][y]=1;
	double tmp=0;
	for(int i=1;i<=k[y][0];i++)
	tmp+=dp(c[c[x][y]][y],k[y][i]);
	return f[x][y]=tmp/k[y][0]+1;
}
int main()
{
	n=read();m=read();C=read();K=read();int u,v;
	memset(c,0X3f,sizeof(c));
	for(int i=1;i<=m;i++)
	{u=read();v=read();add(u,v);}
	for(int i=1;i<=n;i++)bfs(i),k[i][++k[i][0]]=i;
	for(int i=1;i<=n;i++)for(int j=last[i];j;j=e[j].nt)
	k[i][++k[i][0]]=e[j].to;
	printf("%.3lf\n",dp(C,K));
	return 0;
}
/*
4 3
1 4
1 2
2 3
3 4

1.500

9 9
9 3
1 2
2 3
3 4
4 5
3 6
4 6
4 7
7 8
8 9

2.167
*/



标签:可可,ch,聪聪,样例,Noi2005,景点,include,1415
From: https://blog.51cto.com/u_16181403/6652000

相关文章

  • 并查集的具体应用 CF1213G CF444E [HNOI2005]狡猾的商人
    每当我们看到“最大值最小”“路径上的最大最小值”等字眼时,我们就可以考虑并查集。我们可以尝试把这些问题转化为某种意义上按单调顺序的合并,利用并查集求解答案。以下时两例并查集的巧妙应用。CF1213GPathQueries注意“最大权值不大于q”,加上允许离线,我们可以把边按照权值......
  • [NOI2005] 维护数列
    总体思路其实跟用线段树维护区间最大字段和差不多,不过唯一麻烦的地方在于要算上自己。然后我们可以开一个队列来回收那些被delete的点,这样可以节省空间,特别需要注意的是release的时候,标记什么的一定记得清空。本来insert我是直接一个个merge的,这样就会导致特别慢,因此我们可以借......
  • Gauss Prime UVA - 1415
     #include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=5e4;intb[N+2],pm[N+2],tot=0;voidinit(){b[1]=1;for(inti=2;i<=N;i++){if(b[i])continue;pm[++tot]=i;......
  • 聪聪归来!
    时隔半年,我又捡起了我的博客园,准备记录点什么东西,好记性不如烂笔头,对于面向对象的语言来说,把方法封装起来或者做成dll保存起来,后续在使用的时候会轻松很多。程序员不能老想着用自己的脑子记住所有的方法,知道逻辑怎么走,知道是用什么方法才是最重要的,我们想组装一台电脑,没必要去......
  • 【洛谷】P4206 [NOI2005] 聪聪与可可(概率+记忆化搜索)
    原题链接题意给定一张\(n\)个节点\(m\)条边的无向图,初始时,A_zjzj在\(S\),fxt在\(T\),现在A_zjzj要前去抓住fxt。A_zjzj只会往使得两人的最短距离减\(1\)......
  • CodeForces 1415E New Game Plus!
    洛谷传送门CF传送门相当于将\(n\)个数分成\(k+1\)组,将每组的最大收益相加。容易发现组内的数不增最优。考虑开个堆,维护当前\(k+1\)组的和即可。code/*p_b_......
  • CodeForces 1415D XOR-gun
    洛谷传送门CF传送门纯纯的诈骗。下文令\(f(x)\)为\(x\)最高位使得这一位为\(1\)。考虑若存在\(i\in[1,n-2]\)使得\(f(a_i)=f(a_{i+1})=f(a_{i+2})\),那么......
  • luoguP2254 [NOI2005]瑰丽华尔兹 题解
    传送门题意给定\(n\)行\(m\)列的矩阵和钢琴的初始位置\((x,y)\),给定\(k\)个时间段,在每个时间段内钢琴会向给定方向(上/下/左/右)滑动,\(1\)秒移动\(1\)个单位长度......
  • 2022-2023-1 20221415《计算机基础与程序设计》课程总结
    2022-2023-120221415《计算机基础与程序设计》课程总结作业信息这个作业属于哪个课程<班级的链接>(2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业......
  • 2022-2023-1 20221415 《计算机基础与程序设计》第十四周学习总结
    2022-2023-120221415《计算机基础与程序设计》第十四周学习总结作业信息这个作业属于哪个课程<班级的链接>(2022-2023-1-计算机基础与程序设计)这个作业要求在......