【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);
}

原文地址:https://www.cnblogs.com/chen1352/p/9045327.html

时间: 2024-08-02 19:26:59

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

10.23 linux任务计划cron10.24chkconfig工具10.25 systemd管理服务10.26 unit介绍 10.27 target介绍

- 10.23 linux任务计划cron - 10.24 chkconfig工具 - 10.25 systemd管理服务 - 10.26 unit介绍 - 10.27 target介绍 - 扩展 1. anacron http://blog.csdn.net/strikers1982/article/details/4787226  2. xinetd服(默认机器没有安装这个服务,需要yum install xinetd安装) http://blog.sina.com.cn/s/blog_46

云帮社区版10.25更新详情

17 项新功能.12 个bug修复.8篇文档更新.500+用户安装使用,云帮社区版 迎来10.25更新档 过去的1个月,我们收到了不同行业,超过500家企业用户在云帮社区版安装.使用以及优化配置过程中遇到的问题反馈以及对产品的建议.在这个过程中,我们发现了我们产品的诸多不足,同时也感受到了广大用户对我们产品给予的厚望. 通过这一个月紧张的开发和测试,我们的研发团队完成了 17 项新功能的添加,修复了 12 个中等级别以上的bug,并更新了 8 篇维护文档.同时还在GitHub上提交了2个服务检查

hdu 2069 1 5 10 25 50 这几种硬币 一共100个(母函数)

题意: 有50 25 10 5 1 的硬币 一共最多有100枚 输入n输出有多少种表示方法 Sample Input1126 Sample Output413 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <string> 6 # include <cmath> 7 # incl

10.23 linux任务计划cron 10.24 chkconfig工具 10.25 system

八周一次课 10.23 linux任务计划cron 10.24 chkconfig工具 10.25 systemd管理服务 10.26 unit介绍 10.27 target介绍 10.23 linux任务计划cron 10.24 chkconfig工具 显示chkconfig服务 系统启动服务在inittab 10.25 systemd管理服务 10.26 unit介绍 10.27 target介绍 原文地址:http://blog.51cto.com/wbyyy/2066113

10.25 考试总结

10.25 考试总结 距离退役死亡越来越近. circle 其实只要暴力查找就可以了 搜索跑图,稍微注意一下不要让法师反复横跳就可以了,多加一个数据就可以解决只要一找到已经访问过的就证明是环了.... 开始想复杂了,以为可能有一个奇葩的图....原来就是一个简单的环啊 path 其实就是找必经之路,把一些可以多选择的....缩点,实际上就是tarjan缩点, 然后找桥. 桥就是我们要的必经之路 然后又要去学tarjan.....模板一下背不下来 mst 首先用prim 作出最小生成树.然后考虑修

模拟10辆车载板卡发送数据

模拟10辆车载板卡发送数据,通信端口: 11111 链接:https://pan.baidu.com/s/1ZhjMZ4FmNtGJo0CItCHltw 提取码:nkz7 复制这段内容后打开百度网盘手机App,操作更方便哦 import java.io.IOException; import java.net.InetAddress; public class UDP_Client { public static void main(String args[])throws IOExceptio

潍坊一中模拟赛10.25 长途旅行

[题目描述] JY是一个爱旅游的探险家,也是一名强迫症患者.现在JY想要在C国进行一次长途旅行,C国拥有n个城市(编号为0,1,2...,n - 1),城市之间有m条道路,可能某个城市到自己有一条道路,也有可能两个城市之间有多条道路,通过每条道路都要花费一些时间.JY从0号城市开始出发,目的地为n – 1号城市.由于JY想要好好参观一下C国,所以JY想要旅行恰好T小时.为了让自己的旅行更有意思,JY决定不在任何一个时刻停留(走一条到城市自己的路并不算停留).JY想知道是否能够花恰好T小时到达n

10.25模拟赛

NP(np) Description LYK 喜欢研究一些比较困难的问题, 比如 np 问题. 这次它又遇到一个棘手的 np 问题. 问题是这个样子的: 有两个数 n 和 p, 求 n 的阶乘 对 p 取模后的结果. LYK 觉得所有 np 问题都是没有多项式复杂度的算法的,所以它打算求助即将要参加 noip 的你, 帮帮 LYK 吧! Input ? 输入一行两个整数 n,p. Output 输出一行一个整数表示答案. 数据范围 对于 20%的数据: n,p<=5. 对于 40%的数据: n,

【2019.10.25 OI-Killer的模拟赛】3.鸡数

题目链接 题意: 定义“鸡数”指从高位到低位单调不减的数.求$[a,b]$之间有多少个“鸡数”.$t$组询问. $1\le t\le 10^5,\; 1\le a\le b\le 2^{31}-1$ 分析: 数位DP.设$f[i][j]$表示长度为$i$,最高位是$j$的“鸡数”个数,那么$$f[i][j]=\sum\limits^9_{k=j}f[i-1][k]$$ 且$$f[1][i]=1\;(1\le i\le 9)$$ 那么对于一个长度为$l$的$n$且由低到高位写成$s_{1\dots