HDU 5725 Game(计数)
来源:互联网 发布:预谋邂逅知乎 编辑:程序博客网 时间:2024/06/04 22:13
[题目链接]
[题意]
n*m的棋盘上有一些守卫,守卫的攻击范围是一行一列以及周围8格,不会有一个守卫出现在另一个守卫的攻击范围内。现在任选不含守卫的起点和终点,求不经过守卫的最短路的平均值。
[分析]
根据守卫间的相互限制关系,可以发现任意两点间的最短路最多只会被一个守卫影响,即最多只需要绕行2格即可。
所以可以分为2步计算:
1.计算出所有合法点对间的曼哈顿距离之和
2.计算出需要绕行的点对的数量,答案加上它*2
第一步可以分解为横纵坐标,分别求
第二步比较麻烦
首先想到,如果起点在守卫正上方,终点在守卫正下方,一定会绕行,同理一左一右也是
但需要绕行的情况远不止这样
可以看到,红色区域到黄色区域的所有点都需要绕行
可以发现,如果连续几行有守卫,且他们的列坐标是单调上升的,那么所有守卫左边的区域到最后一个守卫右边的区域都需要绕行,同理单调下降就将右边的累计起来
发现了这一点就好办了,逐行扫描一次,再逐列扫描一次即可完成统计
[代码]
#include <bits/stdc++.h>using namespace std ;const int N = 1000 + 5 ;typedef long long LL ;int T , n , m ;int row[N] , col[N] ;char s[N][N] ;int main(){ scanf( "%d" , &T ) ; while( T-- ) { memset(row,0,sizeof(row)) ; memset(col,0,sizeof(col)) ; scanf( "%d%d" , &n , &m ) ; for( int i = 1 ; i <= n ; i++ ) scanf( "%s" , s[i]+1 ) ; double sum = 0 ; LL tot = 0 , sx = 0 , sy = 0 ; for( int i = 1 ; i <= n ; i++ ) { for( int j = 1 ; j <= m ; j++ ) { if( s[i][j] == '#' ) { sx += i ; tot++ ; sum += tot*i - sx ; } else { row[i] = j ; col[j] = i ; } } } tot = 0 ; for( int j = 1 ; j <= m ; j++ ) { for( int i = 1 ; i <= n ; i++ ) { if( s[i][j] == '#' ) { sy += j ; tot++ ; sum += tot*j - sy ; } } } sum *= 2 ; int pre = 0 , L = 0 , R = 0 ; for( int i = 1 ; i <= n ; i++ ) { if( !row[i] ) { pre = L = R = 0 ; continue ; } if( row[i] > pre ) { L += row[i]-1 ; R = m-row[i] ; } else { L = row[i]-1 ; R += m-row[i] ; } sum += 4*L*R ; pre = row[i] ; } pre = L = R = 0 ; for( int i = 1 ; i <= m ; i++ ) { if( !col[i] ) { pre = L = R = 0 ; continue ; } if( col[i] > pre ) { L += col[i]-1 ; R = n-col[i] ; } else { L = col[i]-1 ; R += n-col[i] ; } sum += 4*L*R ; pre = col[i] ; } if( tot ) sum /= 1.0*tot*tot ; printf( "%.4f\n" , sum ) ; } return 0 ;}
0 0
- HDU 5725 Game(计数)
- HDU 4944 FSF’s game(计数游戏)
- hdu 5725(计数)
- 【HDU】5701 - 中位数计数(计数 & 思维)
- HDU 5725 Game
- HDU 5725 Game
- hdu 4455 Substrings(计数)
- hdu 4602 Partition(计数)
- hdu 5514 Frogs(计数)
- hdu 4698 Counting(计数)
- hdu 4705 Y(计数)
- [HDU 5738] Eureka (计数)
- HDU 4451 Dressing(计数)
- HDU 5738 Eureka(计数)
- hdu 1846 Brave Game (Bash Game)
- HDU 4023 Game (博弈)
- Hdu Stone Game ( 博弈论 )
- HDU 3389 Game(博弈)
- jquery DOM 父节点、祖先节点、子节点、子孙节点
- HDU1254 推箱子(BFS)
- 【Postgresql源码分析之一】主备同步复制介绍
- 剑指offer49--第一个不重复的字符
- MySQL外键约束OnDelete和OnUpdate的使用
- HDU 5725 Game(计数)
- Python 之 datetime模块
- php面向对象和面向过程
- Bestcoder_Dertouzos
- Java enum的用法详解
- C++-glog/gflags/protobuf
- JAVA中怎么保留小数点后两位
- 静态方法、实例方法和域
- HDU 1856