【NOIP2012模拟10.25】旅行
题目
给定一个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】旅行的更多相关文章
- 【NOIP2012模拟10.25】剪草
题目 有N棵小草,编号0至N-1.奶牛Bessie不喜欢小草,所以Bessie要用剪刀剪草,目标是使得这N棵小草的高度总和不超过H.在第0时刻,第i棵小草的高度是h[i],接下来的每个整数时刻,会依次 ...
- 【NOIP2012模拟10.25】单元格
题目 在一个R行C列的表格里,我们要选出3个不同的单元格.但要满足如下的两个条件: (1)选中的任意两个单元格都不在同一行. (2)选中的任意两个单元格都不在同一列. 假设我们选中的单元格分别是:A, ...
- [jzoj 5926] [NOIP2018模拟10.25] naive 的图 解题报告(kruskal重构树+二维数点)
题目链接: https://jzoj.net/senior/#main/show/5926 题目: 题解: 显然最小的最大路径在最小生成树上(最小生成树=最小瓶颈生成树) 于是我们建出kruskal重 ...
- 【NOIP2012模拟10.31】掷骰子
题目 太郎和一只免子正在玩一个掷骰子游戏.有一个有N个格子的长条棋盘,太郎和兔子轮流掷一个有M面的骰子,骰子M面分别是1到M的数字.且掷到任意一面的概率是相同的.掷到几.就往前走几步.当谁走到第N格时 ...
- 10.25 正睿停课训练 Day9
目录 2018.10.25 正睿停课训练 Day9 A 数独(思路 DP) B 红绿灯(最短路Dijkstra) C 轰炸(计算几何 圆并) 考试代码 B C 2018.10.25 正睿停课训练 Da ...
- 【NOIP2012模拟8.7】JZOJ2020年8月8日提高组T1 奶牛编号
[NOIP2012模拟8.7]JZOJ2020年8月8日提高组T1 奶牛编号 题目 作为一个神秘的电脑高手,Farmer John 用二进制数字标识他的奶牛. 然而,他有点迷信,标识奶牛用的二进制数字 ...
- 背水一战 Windows 10 (25) - MVVM: 通过 x:Bind 实现 MVVM(不用 Command)
[源码下载] 背水一战 Windows 10 (25) - MVVM: 通过 x:Bind 实现 MVVM(不用 Command) 作者:webabcd 介绍背水一战 Windows 10 之 MVV ...
- /proc/interrupts 统计2.6.38.8与3.10.25差异
eth4进,eth5出 linux-3.10.25 67: 2 3 2 3 PCI-MSI-edge eth468: ...
- 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 ...
随机推荐
- mysql用sql语句创建表和数据 设置字符编码为utf-8
简而言之 CREATE DATABASE xx CHARACTER SET utf8 COLLATE utf8_general_ci; USE xx; ),qname ) ) ) ) )); ) ,t ...
- ArrayList(顺序表)和LinkedList(链表)的区别联系,优劣取舍问题
ArrayList和LinkedList都是List接口的实现类.主要区别如下: 最主要的区别是底层的数据结构不同: 1)ArrayList相当于一个动态数组,需要随机访问列表中的元素时,ArrayL ...
- []转帖]linux 上修改了nginx.conf 怎么重新加载配置文件生效
linux 上修改了nginx.conf 怎么重新加载配置文件生效 https://www.cnblogs.com/zhuyeshen/ 步骤如下先利用/usr/local/nginx/sbin/ng ...
- Redis 3主-3从集群的搭建(CentOS 7)
注意ip地址为: 虚拟机ip设置 TYPE="Ethernet"BOOTPROTO="static"NAME="enp0s3"DEVICE= ...
- C语言--浮点数
在程序中使用浮点数 -- 浮点数的精确性有限 -- 在从c语言中float类型的精确度只到小数点的7位 -- 浮点数只能在一定范围内去相信它 -- 在有精确度高的要求下不要使用浮点数(在算钱的时候,误 ...
- C语言---进制
1. 何为进制 进位机制,逢几进一.数值某一位置上的数在运算时是逢几进一. 生活中的进制:十进制.十二进制(12个月是1年).六十进制(60秒是1分钟) 计算机编程中的进制:二进制.八进制.十六进制. ...
- import和from.…import…
import和from.-import- 在讲之前我们先来讲一下怎样去下载第三方库,我们把python看作一部手机,pip就是应用管家,第三方库里面的模块就是应用管家里面的一个应用 一.import模 ...
- HDU-3714 Error Curves(凸函数求极值)
Error Curves Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- homebrew学习(四)之取消homebrew自动更新
homebrew自动更新 使用brew install /brew cask install安装软件总是先updating HomeBrew…,速度很慢 取消homebrew自动更新 方法一:使用命令 ...
- Filter实现登录功能限制
public void doFilter(ServletRequest arg0,ServletResponse arg1,FilterChain chain) throws IOException, ...