[NOIP2017模拟]路径
2017-07-12 10:15
330 查看
样例数据1
输入
2 2
..
.X
输出
0.888889
样例数据2
输入
3 3
…
.X.
…
输出
2.000000
分析:根据题目所给的障碍物的特殊性质,可知最短路径只可能是(水平宽+铅垂高)或者(水平宽+铅垂高+2)(就是障碍物一直挡住去路只能绕一下的情况,如下图所示),所以只需把所有位置到其他所有位置(包括自己)的距离都加起来,再加上所有特殊的2,最后除以路径总数,可得答案。
100分代码:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<ctime> #include<cmath> #include<algorithm> #include<cctype> #include<iomanip> #include<queue> #include<set> using namespace std; int getint() { int sum=0,f=1; char ch; for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar()); if(ch=='-') { f=-1; ch=getchar(); } for(;ch>='0'&&ch<='9';ch=getchar()) sum=(sum<<3)+(sum<<1)+ch-48; return sum*f; } const int N=1005; char s ; int totx,n,m,liex ,hangx ; long long work(int n,int m,int a[]) { long long res=0; for(int i=1;i<=n;++i)//用行来举例,枚举每一行 { long long sig=0,tot=m-a[i];//记录障碍右侧还有多少个点 for(int j=1;j<=n;++j)//枚举其他所有行(包括自己) if(a[j])//如果这一行有障碍物 sig+=(m-1)*abs(i-j);//那么只有m-1个点可以站人,就只需求m-1个铅垂高 else sig+=m*abs(i-j) fa4c ; if(a[i])//同理,这一行有障碍物的话,那么只有m-1个点可以站人,就只需求m-1个铅垂高 res+=(m-1)*sig; else res+=m*sig; if(a[i])//若本行有障碍物开始特判 { int l=i-1,r=i+1; while(a[l]>a[l+1])//向上枚举,如果每行都有挡住去路的障碍物 tot+=m-a[l],l--;//加上从左边无法最短到达的点 while(a[r]>a[r-1])//向下枚举同理 tot+=m-a[r],r++; res+=2*2*tot*(a[i]-1);//从左到右无法直接到达的都加2,而从右到左也不能到达,所以*2 } } return res; } int main() { freopen("length.in","r",stdin); freopen("length.out","w",stdout); n=getint();m=getint(); for(int i=1;i<=n;++i) { scanf("%s",s); for(int j=1;j<=m;++j) if(s[j-1]=='X') { hangx[i]=j;//存这一行第j个位置有障碍物 liex[j]=i;//存这一列第i个位置有障碍物 totx++; } } int tot=n*m-totx;//所有能站人的点,那么tot*tot就是起点和终点总数 double ans=(work(n,m,hangx)+work(m,n,liex))*1.0/tot/tot;//分别求水平宽和铅垂高 printf("%0.6f\n",ans); return 0; }
本题结。
相关文章推荐
- [NOIP2017模拟]路径统计
- jzoj5290 【NOIP2017提高组A组模拟8.17】行程的交集 (树上路径交,dfs序+树状数组维护姿势)
- 【JZOJ5231】【NOIP2017模拟A组模拟8.5】序列问题
- [NOIP2017模拟]随机图
- JZOJ 4919. 【NOIP2017提高组模拟12.10】神炎皇
- 【jzoj5247】【NOIP2017提高A组模拟8.10】【计算几何】【二分答案】
- [NOIP2017模拟]匹配
- JZOJ5249. 【NOIP2017提高A组模拟8.10】文本编辑器
- 【JZOJ4930】【NOIP2017提高组模拟12.18】C
- JZOJ 100043. 【NOIP2017提高A组模拟7.13】第K小数
- {题解}[jzoj4924]【NOIP2017提高组模拟12.17】向再见说再见
- 【JZOJ5061】【GDOI2017第二轮模拟day1】最长路径
- [NOIP2017模拟][SCOI2005][bzoj1084]最大子矩阵
- 【jzoj5290】【NOIP2017提高组A组模拟8.17】【行程的交集】
- JZOJ 5376. 【NOIP2017提高A组模拟9.19】Candy
- NOIP2017 赛前模拟 7.24
- JZOJ 5328. 【NOIP2017提高A组模拟8.22】世界线
- 5332. 【NOIP2017提高A组模拟8.23】密码 AC自动机+数位DP
- 【JZOJ5330】【NOIP2017提高A组模拟8.22】密码【51nod1569】二项式系数的个数
- JZOJ5390. 【NOIP2017提高A组模拟9.26】逗气