题目

给定一个n行m列的字符矩阵,’.’代表空地,’X’代表障碍。移动的规则是:每秒钟以上下左右四个方向之一移动一格,不能进入障碍。

计算:在空地中随机选择起点和终点(可以重合,此时最短耗时为0),从起点移动到终点最短耗时的平均值。

每一行每一列至多有1个障碍,并且障碍不在对角线方向相邻。以下矩阵是不合法的:

.X

X.

分析

50%的数据,全都是空地,答案就是所有两点间的曼哈顿距离和。

很容易求,\({第i行空地的数量}*{第j行空地的数量}*|i-j|*2\)

因为每一行每一列至多有1个障碍,并且障碍不在对角线方向相邻。得出从A走到B的耗时,要么等于AB的曼哈顿距离,要么等于AB的曼哈顿距离+2。

现在考虑什么情况下距离加二。

观察下图,规律显而易见,我就不多说了,

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const int maxlongint=2147483647;
const int mo=1000000007;
const int N=1005;
using namespace std;
int a[N][N],n,m,sum,sx[N],sy[N],xx[N],xy[N];
double ans;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
char c=getchar();
while(c!='.' && c!='X') c=getchar();
if(c=='.')
{
sx[i]++;
sy[j]++;
sum++;
}
else
{
xx[i]=j;
xy[j]=i;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans+=abs(i-j)*sx[i]*sx[j]*1.0/sum/sum;
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
ans+=abs(i-j)*sy[i]*sy[j]*1.0/sum/sum;
for(int i=1;i<=n;i++)
if(xx[i])
{
int mn=maxlongint,mx=-1;
for(int j=i;j>=1;j--)
{
if(xx[j]>mx && xx[j])
{
ans+=1.0*(xx[i]-1)*(m-xx[j])*2/sum/sum;
mx=xx[j];
}
else
break;
}
for(int j=i;j>=1;j--)
{
if(xx[j]<mn && xx[j])
{
ans+=1.0*(xx[j]-1)*(m-xx[i])*2/sum/sum;
mn=xx[j];
}
else
break;
}
mn=xx[i],mx=xx[i];
for(int j=i+1;j<=n;j++)
{
if(xx[j]>mx && xx[j])
{
ans+=1.0*(xx[i]-1)*(m-xx[j])*2/sum/sum;
mx=xx[j];
}
else
break;
}
for(int j=i+1;j<=n;j++)
{
if(xx[j]<mn && xx[j])
{
ans+=1.0*(xx[j]-1)*(m-xx[i])*2/sum/sum;
mn=xx[j];
}
else
break;
}
}
for(int i=1;i<=m;i++)
if(xy[i])
{
int mn=maxlongint,mx=-1;
for(int j=i;j>=1;j--)
{
if(xy[j]>mx && xy[j])
{
ans+=1.0*(xy[i]-1)*(n-xy[j])*2/sum/sum;
mx=xy[j];
}
else
break;
}
for(int j=i;j>=1;j--)
{
if(xy[j]<mn && xy[j])
{
ans+=1.0*(xy[j]-1)*(n-xy[i])*2/sum/sum;
mn=xy[j];
}
else
break;
}
mn=xy[i],mx=xy[i];
for(int j=i+1;j<=m;j++)
{
if(xy[j]>mx && xy[j])
{
ans+=1.0*(xy[i]-1)*(n-xy[j])*2/sum/sum;
mx=xy[j];
}
else
break;
}
for(int j=i+1;j<=m;j++)
{
if(xy[j]<mn && xy[j])
{
ans+=1.0*(xy[j]-1)*(n-xy[i])*2/sum/sum;
mn=xy[j];
}
else
break;
}
}
printf("%.4lf",ans);
}

【NOIP2012模拟10.25】旅行的更多相关文章

  1. 【NOIP2012模拟10.25】剪草

    题目 有N棵小草,编号0至N-1.奶牛Bessie不喜欢小草,所以Bessie要用剪刀剪草,目标是使得这N棵小草的高度总和不超过H.在第0时刻,第i棵小草的高度是h[i],接下来的每个整数时刻,会依次 ...

  2. 【NOIP2012模拟10.25】单元格

    题目 在一个R行C列的表格里,我们要选出3个不同的单元格.但要满足如下的两个条件: (1)选中的任意两个单元格都不在同一行. (2)选中的任意两个单元格都不在同一列. 假设我们选中的单元格分别是:A, ...

  3. [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)

    题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...

  4. 【NOIP2012模拟10.31】掷骰子

    题目 太郎和一只免子正在玩一个掷骰子游戏.有一个有N个格子的长条棋盘,太郎和兔子轮流掷一个有M面的骰子,骰子M面分别是1到M的数字.且掷到任意一面的概率是相同的.掷到几.就往前走几步.当谁走到第N格时 ...

  5. 10.25 正睿停课训练 Day9

    目录 2018.10.25 正睿停课训练 Day9 A 数独(思路 DP) B 红绿灯(最短路Dijkstra) C 轰炸(计算几何 圆并) 考试代码 B C 2018.10.25 正睿停课训练 Da ...

  6. 【NOIP2012模拟8.7】JZOJ2020年8月8日提高组T1 奶牛编号

    [NOIP2012模拟8.7]JZOJ2020年8月8日提高组T1 奶牛编号 题目 作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛. 然而,他有点迷信,标识奶牛用的二进制数字 ...

  7. 背水一战 Windows 10 (25) - MVVM: 通过 x:Bind 实现 MVVM(不用 Command)

    [源码下载] 背水一战 Windows 10 (25) - MVVM: 通过 x:Bind 实现 MVVM(不用 Command) 作者:webabcd 介绍背水一战 Windows 10 之 MVV ...

  8. /proc/interrupts 统计2.6.38.8与3.10.25差异

    eth4进,eth5出 linux-3.10.25 67:          2          3          2          3   PCI-MSI-edge     eth468: ...

  9. CentOS安装NodeJS v0.10.25 + Express

    安装必需组件 yum -y install gcc make gcc-c++ openssl-devel wget cd ~wget http://nodejs.org/dist/v0.10.25/n ...

随机推荐

  1. P1706 【全排列问题】

    超级无敌大题面~~ 这题倒也花了我不少时间,不停想节省空间,但这也确实是最省的了... 主要思路呢,要注意标记数有没有选过,并标记每个数的输出顺序.. 具体注释见代码: #include<cst ...

  2. 【VS开发】【图像处理】RGB各种格式

    RGB格式 RGB组合格式 名字 RGB组合格式 描述 此格式用来匹配PC图形帧缓存.每个像素占据8,16,24或32个位,他们都是组合像素格式,其意为在内存中所有像素数据都是相邻排列的.当使用这些格 ...

  3. Java 并发编程:volatile的使用及其原理(二)

    一.volatile的作用 在<Java并发编程:核心理论>一文中,我们已经提到过可见性.有序性及原子性问题,通常情况下我们可以通过Synchronized关键字来解决这些个问题,不过如果 ...

  4. [转帖]基于VIM漏洞CVE-2019-12735的VIM宏后门病毒详解

    基于VIM漏洞CVE-2019-12735的VIM宏后门病毒详解 不明觉厉 只要是人做的东西 就会有bug 就会有安全问题 就看发现bug 或者是发现安全问题 有没有收益了 会用linux的都是比较熟 ...

  5. Python流程控制与while 循环(day01)

    一:流程控制 假如把写程序比做走路,那我们到现在为止,一直走的都是直路,还没遇到过分叉口,想象现实中,你遇到了分叉口,然后你决定往哪拐必然是有所动机的.你要判断哪条叉路是你真正要走的路,如果我们想让 ...

  6. Linux下面误删除文件使用extundelete工具恢复介绍

    操作系统版本:CentOS release 6.4 (Final)      软件版本:extundelete-0.2.4.tar.bz2 PS:该软件恢复文件系统仅支持ext2/ext3/ext4 ...

  7. void *与id类型的相互转换

    void *与id类型相互转换 在MRC下,void *与id类型相互转换完全没问题. id obj = [[NSObject alloc] init]; void *p = (void *)p; o ...

  8. Luogu P2839 [国家集训队]middle

    题目 首先我们考虑解决中位数一类问题的常用手段:二分\(mid\),将大于等于它的设为\(1\),小于它的设为\(−1\),判断区间和是否\(\ge0\). 对于询问\(a,b,c,d\),二分完\( ...

  9. springboot2.0结合fastdfs实现文件分布式上传

    1. 引入依赖 在父工程中,我们已经管理了依赖,版本为: <fastDFS.client.version>1.26.7</fastDFS.client.version> 因此, ...

  10. springboot处理单个文件上传

    1. 引入pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</gro ...