题目

给定一个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];}elsebreak;}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];}elsebreak;}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];}elsebreak;}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];}elsebreak;}}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];}elsebreak;}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];}elsebreak;}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];}elsebreak;}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];}elsebreak;}}printf("%.4lf",ans);
}

转载于:https://www.cnblogs.com/chen1352/p/9045327.html

【NOIP2012模拟10.25】旅行相关推荐

  1. JZOJ 3053 【NOIP2012模拟10.25】旅行

    旅行 题目大意 给定一个 n n行mm列的字符矩阵, 告诉你哪些格子可以进入,哪些不可以.移动的规则为:每秒钟以上下左右四个方向之一移动一格,不能进入障碍. 计算:在空地中随机选择起点和终点(可以重合 ...

  2. 【NOIP2012模拟10.25】剪草

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

  3. jzoj3058. 【NOIP2012模拟10.26】火炬手

    jzoj3058. [NOIP2012模拟10.26]火炬手 题目 Description Input Output Sample Input Sample Output Hint 分析 做法一 做法 ...

  4. JZOJ 5925. 【NOIP2018模拟10.25】naive 的瓶子

    Description 众所周知,小 naive 有 n 个瓶子,它们在桌子上排成一排.第 i 个瓶子的颜色为 ci,每个瓶子都有灵性,每次操作可以选择两个相邻的瓶子,消耗他们颜色的数值乘积的代价将其 ...

  5. 【NOIP2012模拟10.20】友好数对

    Description 如果一个数a 能由一个数b 旋转得到,那么我们称<a,b>为友好数对,如12345 和45123 为友好数对,12345 和54321 不为友好数对.给出两个正整数 ...

  6. JZOJ 3057. 【NOIP2012模拟10.26】电影票

    .. 分析: 代码: 分析: 我们通过找规律,可以得知答案为: 但我们直接通过高精度计算的话铁定TTT飞 所以我们将式子带入其中,就会发现分母和分子是可以约分的!并且分母可以被约掉 所以我们可以创建两 ...

  7. 【NOIP2012模拟10.26】火炬手

    Description 全运会就要开始了,笨笨想成为湖南地区的火炬手,经过层层选拔,最终到了最后一关,这一关给出了一个正整数n(N<=100000),求一个最小的正整数m,使得n*m的十进制表示 ...

  8. jzoj 3058. 【NOIP2012模拟10.26】火炬手

    Description 全运会就要开始了,笨笨想成为湖南地区的火炬手,经过层层选拔,最终到了最后一关,这一关给出了一个正整数n(N<=100000),求一个最小的正整数m,使得n*m的十进制表示 ...

  9. 高中OJ3057【NOIP2012模拟10.26】电影票

    (毫无PS痕迹) 表示这题在听的时候越听越懵逼 就听懂了推出来的公式,之后的化简一直是处于掉线状态 最后把旧OJ的义务植树加强2星复制过来再改了一下就神奇般的AC了 正解: 讲题时那人画了一个类似下图 ...

最新文章

  1. 人工智能的产业落地经验!
  2. 力特usb转232驱动程序下载_毕亚兹 USB转RJ45网线接口USB扩充口,特殊时期在家办公更轻松...
  3. LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
  4. pollard_rho大数分解Java版
  5. 单片机中存储器扩展位地址线怎么算_51单片机CPU结构各部件的原理详细分析
  6. C++ 用new 动态创建多维数组
  7. 男生眼中“理想女友”工作排名,程序员排名第三,幼师倒数第一
  8. 建立局域网计算机应安装,两台电脑如何建立局域网
  9. Educational Codeforces Round 58
  10. arraylist从大到小排序_为什么插入排序比冒泡排序更受欢迎?
  11. linux向苹果手机传文件,堪比 AirDrop,iPhone 与 Windows 电脑互传文件的三种方式
  12. 以Maya为引擎的小游戏:是男Yin就坚持2K帧
  13. phpMyAdmin安装详解
  14. 【从蛋壳到满天飞】JS 数据结构解析和算法实现-Arrays(数组)
  15. 各大型网站反爬虫策略
  16. Latex取消英语单词自动断行
  17. core dumped调试Segmentation fault
  18. fatal: unable to access ‘https://github.com/xxxxx/xxx.git/‘: OpenSSL SSL_read: Connection was reset,
  19. Windows11 C盘清理-系统休眠文件占用15G
  20. K3工业老单单据的相关表

热门文章

  1. Win7下JDK环境变量设置批处理(转)
  2. 【R】【BiocManager::install】R语言装包
  3. linux date使用方法,linux命令详解date使用方法(计算母亲节和父亲节日期脚本示例)...
  4. python源代码的后缀名是_Python代码编译与反编译
  5. 适合写python的电脑_这篇写给想选计算机专业的学弟学妹们
  6. url 参数 后台 加密_一套拿来即用的后台管理系统,非常方便(附项目地址)
  7. linux 音频路径,Linux系统中提取DVD音频的方法介绍(转)
  8. ajax bootstrap 进度条,Bootstrap进度条与AJAX后端数据传递结合使用实例详解
  9. C++编程进阶8(最好不要实现类型转换运算符、单形参的构造函数与类型转换、临时对象与RVO)
  10. 14.QueuedConnection和BlockingQueuedConnection连接方式源码分析