题目

给定一个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. 模糊查询基于select遍历json文件自动填充的实现

    HTML页面 <tr> <td align="left"><span>案由</span> <input type=" ...

  2. 求第n个质数

    输入一个不超过 10000 的正整数 n,求第n个质数 样例输入 10 样例输出 29 题目地址 #include<stdio.h> #include<math.h> int ...

  3. Tomcat启动报错:“通配符的匹配很全面, 但无法找到元素 'tx:annotation-driven' 的声明“

    从报错信息就可以明显察觉到是xml配置文件出现的问题 <?xml version="1.0" encoding="UTF-8"?> <bean ...

  4. 剑指OFFER数据结构与算法分类

    目录 数据结构 算法 数据结构 数组 有序二维数组查找 数组相对位置排序 数组顺时针输出 把数组排成最小的数 数组中的逆序对 扑克牌顺子 数组中重复的数字 构建乘积数组 链表 链表反向插入ArrayL ...

  5. adobe Keychain mac

    Keychain password access This question has been Answered. janec2070563 May 8, 2018 11:07 AM I consta ...

  6. linux挂载 mount

    挂载(mounting)是指由操作系统使一个存储设备(诸如硬盘.CD-ROM或共享资源)上的计算机文件和目录可供用户通过计算机的文件系统访问的一个过程. Linux系统下目录和磁盘是分开的,磁盘上的文 ...

  7. spring boot-15.缓存

    为了减轻数据库压力和提高访问速度,从spring3.1开始映入了基于注解的缓存机制. 1.Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, ...

  8. 索引之----mysql单列索引失效的情况

    使用的索引名称: 1.隐式转换导致索引失效. 由于表字段定义为vachar类型,但在查询时把该字段作为number类型 以及where条件传给mysql. 2.对索引列进行任何操作(计算(+.-.*. ...

  9. javaSE温习一&二

    这是一个简单的笔记 涉及到常量.变量:流程控制语句.数组:类与对象.封装.构造方法:Scanner类.Random类.Arraylist类: 1.pubic class  static void 2. ...

  10. mysql整理-常用sql语句

    一.常用sql show variables like 'character_set_client';#查询字符集 show databases;#列出所有的服务器上的数据库alter create ...